├── .eslintignore ├── .eslintrc ├── .github └── workflows │ └── test.yml ├── .gitignore ├── .npmignore ├── .prettierrc ├── README.md ├── cross-env.json ├── package.json ├── src ├── index.ts ├── packages │ ├── checkers │ │ ├── constant.ts │ │ ├── index.ts │ │ ├── international │ │ │ ├── board.ts │ │ │ ├── index.ts │ │ │ └── item.ts │ │ └── turkish │ │ │ ├── board.spec.ts │ │ │ ├── board.ts │ │ │ ├── index.ts │ │ │ └── item.ts │ └── core │ │ ├── board.spec.ts │ │ ├── board.ts │ │ ├── index.ts │ │ └── item.ts └── utils │ ├── getAvailableColumns.ts │ ├── index.ts │ └── parseCoord.ts ├── tsconfig.json └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "plugins": ["@typescript-eslint"], 5 | "extends": [ 6 | "eslint:recommended", 7 | "plugin:@typescript-eslint/eslint-recommended", 8 | "plugin:@typescript-eslint/recommended" 9 | ], 10 | "rules": { 11 | "no-console": 2 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Node.js CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | strategy: 10 | matrix: 11 | node-version: [12.x] 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Use Node.js ${{ matrix.node-version }} 16 | uses: actions/setup-node@v1 17 | with: 18 | node-version: ${{ matrix.node-version }} 19 | - run: npm install 20 | - run: npm test 21 | env: 22 | CI: true 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | .cache/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .cache/ 2 | example/ -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "trailingComma": "es5", 4 | "printWidth": 80, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ymir-js 2 | 3 | This toolkit is created to make it easier for you to develop games like chess, checkers, go, match 3 puzzle and more. It is still under development. 4 | 5 | ### Create Board 6 | 7 | ```js 8 | const board = new Board({ x: 3, y: 3 }); 9 | ``` 10 | 11 | ### Set Item 12 | 13 | ```js 14 | const item = new Item({ name: 'myFirstItem' }); 15 | board.setItem('0|0', item); 16 | ``` 17 | 18 | ### Get Item 19 | 20 | ```js 21 | board.getItem('0|0'); 22 | // => { name: 'myFirstItem', ... } 23 | ``` 24 | 25 | ### Move Item 26 | 27 | ```js 28 | board.moveItem('0|0', '1|1'); 29 | ``` 30 | 31 | ### Remove Item 32 | 33 | ```js 34 | board.removeItem('1|1'); 35 | ``` 36 | 37 | ### Switch Item 38 | 39 | ```js 40 | const firstItem = new Item({ name: 'myFirstItem' }); 41 | const secondItem = new Item({ name: 'mySecondItem' }); 42 | 43 | board.setItem('0|0', firstItem); 44 | board.setItem('1|1', secondItem); 45 | 46 | board.switchItem('0|0', '1|1'); 47 | 48 | board.getItem('0|0'); 49 | // => { name: 'mySecondItem', ... } 50 | 51 | board.getItem('1|1'); 52 | // => { name: 'myFirstItem', ... } 53 | ``` 54 | 55 | ### Empty Control 56 | 57 | ```js 58 | board.isEmpty('2|2'); 59 | // => true 60 | ``` 61 | 62 | ### Exist Control 63 | 64 | ```js 65 | const board = new Board({ x: 3, y: 3 }); 66 | 67 | board.isExistCoord('5|5'); 68 | // => false 69 | ``` 70 | 71 | ### Get Matrix 72 | 73 | ```js 74 | board.getBoardMatrix(); 75 | 76 | /* => 77 | [ 78 | [{ item }, { item }, { item }], 79 | [{ item }, { item }, { item }], 80 | [{ item }, { item }, { item }] 81 | ] 82 | */ 83 | ``` 84 | 85 | --- 86 | 87 | ## Roadmap 88 | 89 | | Name | Status | Link | 90 | | ---------------------- | ------ | --------------------------------------------------------------- | 91 | | Turkish Checkers | WIP | [Source](https://github.com/aykutkardas/turkish-checkers) | 92 | | International Checkers | WIP | [Source](https://github.com/aykutkardas/international-checkers) | 93 | | Chess | - | - | 94 | | Match 3 Puzzle | - | - | 95 | | Go | - | - | 96 | 97 | --- 98 | -------------------------------------------------------------------------------- /cross-env.json: -------------------------------------------------------------------------------- 1 | { "TS_NODE_COMPILER_OPTIONS": { "module": "commonjs" } } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ymir-js", 3 | "version": "0.9.1", 4 | "description": "This toolkit is created to make it easier for you to develop games like chess, checkers, go, match 3 puzzle and more. It is still under development.", 5 | "main": "dist/index.js", 6 | "scripts": { 7 | "test": "cross-env-file -p ./cross-env.json mocha -r ts-node/register src/**/*.spec.ts", 8 | "build": "tsc", 9 | "lint": "eslint . --ext .ts --fix" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/aykutkardas/ymir-js.git" 14 | }, 15 | "keywords": [ 16 | "board", 17 | "game", 18 | "toolkit", 19 | "checkers" 20 | ], 21 | "author": "", 22 | "license": "ISC", 23 | "devDependencies": { 24 | "@types/chai": "^4.2.15", 25 | "@types/jest": "^28.1.6", 26 | "@typescript-eslint/eslint-plugin": "^5.32.0", 27 | "@typescript-eslint/parser": "^5.32.0", 28 | "chai": "^4.2.0", 29 | "cross-env-file": "^1.0.0", 30 | "eslint": "^8.21.0", 31 | "jsdom": "^20.0.0", 32 | "jsdom-global": "^3.0.2", 33 | "mocha": "^10.0.0", 34 | "ts-node": "^10.9.1", 35 | "typescript": "^4.7.4" 36 | }, 37 | "dependencies": { 38 | "lodash": "^4.17.21" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import Core from './packages/core'; 2 | import Checkers from './packages/checkers'; 3 | import Utils from './utils'; 4 | 5 | export { Core, Checkers, Utils }; 6 | -------------------------------------------------------------------------------- /src/packages/checkers/constant.ts: -------------------------------------------------------------------------------- 1 | export const CHECKERS_INTERNATIONAL = 'international'; 2 | export const CHECKERS_TURKISH = 'turkish'; 3 | export const CHECKERS_WHITE = 'white'; 4 | export const CHECKERS_BLACK = 'black'; 5 | -------------------------------------------------------------------------------- /src/packages/checkers/index.ts: -------------------------------------------------------------------------------- 1 | import Turkish from './turkish'; 2 | import International from './international'; 3 | 4 | export default { Turkish, International }; 5 | -------------------------------------------------------------------------------- /src/packages/checkers/international/board.ts: -------------------------------------------------------------------------------- 1 | import * as _ from 'lodash'; 2 | 3 | import getAvailableColumns from '../../../utils/getAvailableColumns'; 4 | import Board from '../../core/board'; 5 | import { MovementType } from '../../core/item'; 6 | import Item, { CheckersColorType, CheckersItemType } from './item'; 7 | 8 | export type BoardConfig = { 9 | x: number; 10 | y: number; 11 | }; 12 | 13 | export type CheckersBoardType = { [key: string]: { item: CheckersItemType } }; 14 | 15 | export type AttactCoord = { coord: string; destroyItemCoord: string }; 16 | 17 | export type DefendCoord = { coord: string; inDangerItemCoord: string }; 18 | 19 | class InternationalCheckersBoard extends Board { 20 | board: CheckersBoardType; 21 | 22 | constructor(config: BoardConfig = { x: 10, y: 10 }) { 23 | super(config); 24 | 25 | return this; 26 | } 27 | 28 | init() { 29 | const whiteItemCoords = 30 | '0|1 0|3 0|5 0|7 0|9 1|0 1|2 1|4 1|6 1|8 2|1 2|3 2|5 2|7 2|9 3|0 3|2 3|4 3|6 3|8'; 31 | const blackItemCoords = 32 | '6|1 6|3 6|5 6|7 6|9 7|0 7|2 7|4 7|6 7|8 8|1 8|3 8|5 8|7 8|9 9|0 9|2 9|4 9|6 9|8'; 33 | 34 | whiteItemCoords.split(' ').forEach((coord) => { 35 | this.setItem(coord, new Item({ color: 'white' })); 36 | }); 37 | 38 | blackItemCoords.split(' ').forEach((coord) => { 39 | this.setItem(coord, new Item({ color: 'black' })); 40 | }); 41 | 42 | return this; 43 | } 44 | 45 | reset(): void { 46 | Object.keys(this.board).forEach(this.removeItem); 47 | 48 | this.init(); 49 | } 50 | 51 | getItemsBetweenTwoCoords(fromCoord: string, toCoord: string): string[] { 52 | const direction = this.getDirection(fromCoord, toCoord); 53 | const distance = this.getDistanceBetweenTwoCoords(fromCoord, toCoord); 54 | const convertDirection = { 55 | top: 'y', 56 | bottom: 'y', 57 | left: 'x', 58 | right: 'x', 59 | }; 60 | const stepCount = Math.abs(distance[convertDirection[direction]]) || 1; 61 | const movement = { stepCount }; 62 | 63 | movement[direction] = true; 64 | 65 | const betweenCoords = []; 66 | 67 | return betweenCoords 68 | .concat(...Object.values(getAvailableColumns(fromCoord, movement))) 69 | .filter((coord) => !this.isEmpty(coord)); 70 | } 71 | 72 | getAvailableCoordsByColor = ( 73 | color: CheckersColorType 74 | ): Record => { 75 | const currentItems = []; 76 | const availableCoords = {}; 77 | 78 | Object.entries(this.board).forEach(([coord, col]) => { 79 | if (col.item && col.item.color === color) { 80 | currentItems.push(coord); 81 | } 82 | }); 83 | 84 | currentItems.forEach((coord) => { 85 | const item = this.getItem(coord); 86 | const currentAvailableCoords = this.getAvailableColumns( 87 | coord, 88 | item.movement 89 | ); 90 | 91 | if (currentAvailableCoords.length) { 92 | availableCoords[coord] = currentAvailableCoords; 93 | } 94 | }); 95 | 96 | return availableCoords; 97 | }; 98 | 99 | getAttackCoordsByColor = ( 100 | color: CheckersColorType 101 | ): { [coord: string]: AttactCoord[] } => { 102 | const availableCoords = this.getAvailableCoordsByColor(color); 103 | const attackCoords = {}; 104 | 105 | Object.entries(availableCoords).forEach( 106 | ([coord, currentAvailableCoords]) => { 107 | currentAvailableCoords.forEach((currentAvailableCoord) => { 108 | const [destroyItemCoord] = this.getItemsBetweenTwoCoords( 109 | coord, 110 | currentAvailableCoord 111 | ); 112 | 113 | if (destroyItemCoord) { 114 | if (attackCoords[coord]) { 115 | attackCoords[coord].push({ 116 | coord: currentAvailableCoord, 117 | destroyItemCoord, 118 | }); 119 | } else { 120 | attackCoords[coord] = [ 121 | { coord: currentAvailableCoord, destroyItemCoord }, 122 | ]; 123 | } 124 | } 125 | }); 126 | } 127 | ); 128 | 129 | return attackCoords; 130 | }; 131 | 132 | getDefendCoordsByColor = ( 133 | color: CheckersColorType 134 | ): { [coord: string]: DefendCoord[] } => { 135 | const defendCoords = {}; 136 | 137 | const enemyColor = color === 'white' ? 'black' : 'white'; 138 | const availableCoords = this.getAvailableCoordsByColor(color); 139 | const enemyAttackCoords = this.getAttackCoordsByColor(enemyColor); 140 | 141 | Object.entries(enemyAttackCoords).forEach(([, enemyAttack]) => { 142 | Object.values(enemyAttack).forEach((enemyAttackCoord) => { 143 | Object.keys(availableCoords).forEach((availableItemOrigin) => { 144 | const availableColumnCoords = availableCoords[availableItemOrigin]; 145 | 146 | if ( 147 | availableColumnCoords.includes(enemyAttackCoord.coord) && 148 | availableItemOrigin !== enemyAttackCoord.destroyItemCoord 149 | ) { 150 | const defendCoordItem = { 151 | coord: enemyAttackCoord.coord, 152 | inDangerCoord: enemyAttackCoord.destroyItemCoord, 153 | }; 154 | 155 | if (defendCoords[availableItemOrigin]) { 156 | defendCoords[availableItemOrigin].push(defendCoordItem); 157 | } else { 158 | defendCoords[availableItemOrigin] = [defendCoordItem]; 159 | } 160 | } 161 | }); 162 | }); 163 | }); 164 | 165 | return defendCoords; 166 | }; 167 | 168 | getItemsByColor = (color: CheckersColorType): CheckersItemType[] => { 169 | return Object.values(this.board) 170 | .filter(({ item }) => item?.color === color) 171 | .map(({ item }) => item); 172 | }; 173 | 174 | getAvailableColumns = (coord: string, movement: MovementType): string[] => { 175 | if (this.isEmpty(coord)) return []; 176 | 177 | const columns = getAvailableColumns(coord, movement); 178 | const availableColumns: Record = {}; 179 | const captureAvailableColumns = {}; 180 | const item = this.getItem(coord); 181 | 182 | Object.keys(columns).forEach((key) => { 183 | availableColumns[key] = []; 184 | let isFoundCapture = false; 185 | 186 | for (let i = 0; i < columns[key].length; i += 1) { 187 | const currentCoord = columns[key][i]; 188 | 189 | if (!this.isExistCoord(currentCoord)) continue; 190 | if (this.isEmpty(currentCoord)) { 191 | availableColumns[key].push(currentCoord); 192 | continue; 193 | } else if (isFoundCapture) { 194 | break; 195 | } 196 | 197 | const nextCoordItem = this.getItem(currentCoord); 198 | 199 | if (nextCoordItem?.color === item.color) { 200 | break; 201 | } else if ( 202 | !isFoundCapture && 203 | nextCoordItem && 204 | nextCoordItem.color !== item.color 205 | ) { 206 | const direction = this.getDirection(coord, currentCoord); 207 | const movementRule = { 208 | stepCount: 1, 209 | [direction]: true, 210 | }; 211 | 212 | const [afterCoord] = Object.values( 213 | getAvailableColumns(currentCoord, movementRule) 214 | ) 215 | .filter((arr) => arr.length) 216 | .flat(); 217 | 218 | const afterItem = this.getItem(afterCoord); 219 | 220 | if (afterItem) break; 221 | 222 | if (this.isEmpty(afterCoord)) { 223 | availableColumns[key] = [afterCoord]; 224 | captureAvailableColumns[key] = true; 225 | isFoundCapture = true; 226 | } else { 227 | break; 228 | } 229 | } 230 | } 231 | }); 232 | 233 | const resultCoords: Record = {}; 234 | 235 | const isFoundAnySuccessDirection = Object.values( 236 | captureAvailableColumns 237 | ).some((direction) => direction); 238 | 239 | Object.keys(availableColumns).forEach((key) => { 240 | if (!isFoundAnySuccessDirection) { 241 | resultCoords[key] = _.uniq(availableColumns[key]); 242 | } else if (captureAvailableColumns[key]) { 243 | resultCoords[key] = _.uniq(availableColumns[key]); 244 | } 245 | }); 246 | 247 | return Object.values(resultCoords).flat(); 248 | }; 249 | } 250 | 251 | export default InternationalCheckersBoard; 252 | -------------------------------------------------------------------------------- /src/packages/checkers/international/index.ts: -------------------------------------------------------------------------------- 1 | import Board from './board'; 2 | import Item from './item'; 3 | 4 | export default { Board, Item }; 5 | -------------------------------------------------------------------------------- /src/packages/checkers/international/item.ts: -------------------------------------------------------------------------------- 1 | import Item, { ItemType, MovementType } from '../../core/item'; 2 | import { CHECKERS_WHITE, CHECKERS_BLACK } from '../constant'; 3 | 4 | export type CheckersColorType = typeof CHECKERS_BLACK | typeof CHECKERS_WHITE; 5 | 6 | export interface CheckersItemType extends ItemType { 7 | color: CheckersColorType; 8 | king: boolean; 9 | } 10 | 11 | class CheckersItem extends Item implements CheckersItemType { 12 | color: CheckersColorType; 13 | 14 | king: boolean; 15 | 16 | movement: MovementType = {}; 17 | 18 | constructor(item) { 19 | super(item); 20 | 21 | this.color = item.color || CHECKERS_BLACK; 22 | this.king = item.king || false; 23 | this.movement = item.movement || {}; 24 | 25 | if (item.king) { 26 | this.movement.angular = true; 27 | this.movement.stepCount = 9; 28 | } else { 29 | const isBlack = this.color === CHECKERS_BLACK; 30 | this.movement[isBlack ? 'topLeft' : 'bottomLeft'] = true; 31 | this.movement[isBlack ? 'topRight' : 'bottomRight'] = true; 32 | } 33 | } 34 | 35 | // TODO: Write Test 36 | setKing(): void { 37 | this.movement = { 38 | angular: true, 39 | stepCount: 9, 40 | }; 41 | 42 | this.king = true; 43 | } 44 | } 45 | 46 | export default CheckersItem; 47 | -------------------------------------------------------------------------------- /src/packages/checkers/turkish/board.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import 'mocha'; 3 | import CheckersItem from '../turkish/item'; 4 | 5 | import CheckersBoard from './board'; 6 | 7 | describe('Turkish Checkers', () => { 8 | it('board.config', () => { 9 | const board = new CheckersBoard(); 10 | 11 | expect(board.config).to.deep.equal({ 12 | x: 8, 13 | y: 8, 14 | }); 15 | }); 16 | 17 | it('reset', () => { 18 | const defaultBoard = new CheckersBoard(); 19 | defaultBoard.init(); 20 | 21 | const board = new CheckersBoard(); 22 | board.init(); 23 | board.moveItem('5|5', '4|5'); 24 | board.reset(); 25 | 26 | expect(board.board).to.deep.equal(defaultBoard.board); 27 | }); 28 | 29 | it('getItemsBetweenTwoCoords', () => { 30 | const board = new CheckersBoard(); 31 | board.init(); 32 | 33 | expect(board.getItemsBetweenTwoCoords('4|4', '7|4')).to.deep.equal([ 34 | '5|4', 35 | '6|4', 36 | ]); 37 | }); 38 | 39 | it('getAvailableCoordsByColor', () => { 40 | const board = new CheckersBoard(); 41 | board.init(); 42 | 43 | expect(board.getAvailableCoordsByColor('white')).to.deep.equal({ 44 | '2|0': ['3|0'], 45 | '2|1': ['3|1'], 46 | '2|2': ['3|2'], 47 | '2|3': ['3|3'], 48 | '2|4': ['3|4'], 49 | '2|5': ['3|5'], 50 | '2|6': ['3|6'], 51 | '2|7': ['3|7'], 52 | }); 53 | }); 54 | 55 | it('getAvailableCoordsByColor with attack', () => { 56 | const board = new CheckersBoard(); 57 | board.init(); 58 | board.moveItem('2|5', '3|5'); 59 | board.moveItem('5|5', '4|5'); 60 | 61 | expect(board.getAvailableCoordsByColor('white')).to.deep.equal({ 62 | '1|5': ['2|5'], 63 | '2|0': ['3|0'], 64 | '2|1': ['3|1'], 65 | '2|2': ['3|2'], 66 | '2|3': ['3|3'], 67 | '2|4': ['3|4', '2|5'], 68 | '3|5': ['5|5'], 69 | '2|6': ['3|6', '2|5'], 70 | '2|7': ['3|7'], 71 | }); 72 | }); 73 | 74 | it('getAvailableCoordsByColor with attack 2', () => { 75 | const board = new CheckersBoard(); 76 | const firstWhiteItem = new CheckersItem({ color: 'white', king: true }); 77 | const blackItem = new CheckersItem({ color: 'black' }); 78 | 79 | board.setItem('1|5', firstWhiteItem); 80 | board.setItem('2|5', blackItem); 81 | board.setItem('3|5', blackItem); 82 | 83 | expect(board.getAvailableCoordsByColor('white')).to.deep.equal({ 84 | '1|5': ['0|5', '1|4', '1|3', '1|2', '1|1', '1|0', '1|6', '1|7'], 85 | }); 86 | }); 87 | 88 | it('getAvailableCoordsByColor with attack 3', () => { 89 | const board = new CheckersBoard(); 90 | const firstWhiteItem = new CheckersItem({ color: 'white', king: true }); 91 | const secondWhiteItem = new CheckersItem({ color: 'white' }); 92 | const blackItem = new CheckersItem({ color: 'black' }); 93 | 94 | board.setItem('1|5', firstWhiteItem); 95 | board.setItem('2|5', secondWhiteItem); 96 | board.setItem('6|5', blackItem); 97 | 98 | expect(board.getAvailableCoordsByColor('white')).to.deep.equal({ 99 | '1|5': ['0|5', '1|4', '1|3', '1|2', '1|1', '1|0', '1|6', '1|7'], 100 | '2|5': ['3|5', '2|4', '2|6'], 101 | }); 102 | }); 103 | 104 | it('getAvailableCoordsByColor with attack 4', () => { 105 | const board = new CheckersBoard(); 106 | const firstWhiteItem = new CheckersItem({ color: 'white' }); 107 | const secondWhiteItem = new CheckersItem({ color: 'white' }); 108 | const blackItem = new CheckersItem({ color: 'black', king: true }); 109 | 110 | board.setItem('1|5', firstWhiteItem); 111 | board.setItem('4|5', secondWhiteItem); 112 | board.setItem('5|5', blackItem); 113 | board.getItem('5|5').setKing(); 114 | 115 | expect(board.getAvailableCoordsByColor('black')).to.deep.equal({ 116 | '5|5': ['3|5', '2|5'], 117 | }); 118 | }); 119 | 120 | it('getAttackCoordsByColor', () => { 121 | const board = new CheckersBoard(); 122 | board.init(); 123 | board.moveItem('2|5', '3|5'); 124 | board.moveItem('5|5', '4|5'); 125 | board.moveItem('5|4', '3|4'); 126 | 127 | expect(board.getAttackCoordsByColor('white')).to.deep.equal({ 128 | '3|5': [ 129 | { coord: '5|5', destroyItemCoord: '4|5' }, 130 | { coord: '3|3', destroyItemCoord: '3|4' }, 131 | ], 132 | '2|4': [{ coord: '4|4', destroyItemCoord: '3|4' }], 133 | }); 134 | }); 135 | 136 | it('getDefendCoordsByColor', () => { 137 | const board = new CheckersBoard(); 138 | board.init(); 139 | board.moveItem('5|1', '4|1'); 140 | board.moveItem('2|1', '3|1'); 141 | 142 | expect(board.getDefendCoordsByColor('white')).to.deep.equal({ 143 | '1|1': [{ coord: '2|1', inDangerCoord: '3|1' }], 144 | '2|0': [{ coord: '2|1', inDangerCoord: '3|1' }], 145 | '2|2': [{ coord: '2|1', inDangerCoord: '3|1' }], 146 | }); 147 | }); 148 | 149 | it('getDefendCoordsByColor Horizontal', () => { 150 | const board = new CheckersBoard(); 151 | board.init(); 152 | board.moveItem('2|1', '3|1'); 153 | board.moveItem('5|2', '3|2'); 154 | 155 | expect(board.getDefendCoordsByColor('white')).to.deep.equal({ 156 | '2|0': [{ coord: '3|0', inDangerCoord: '3|1' }], 157 | }); 158 | }); 159 | 160 | it('getItemsByColor ', () => { 161 | const board = new CheckersBoard(); 162 | board.init(); 163 | 164 | expect(board.getItemsByColor('white').length).to.equal(16); 165 | }); 166 | }); 167 | 168 | describe('Turkish Checkers Available Columns', () => { 169 | it('getAvailableColumns', () => { 170 | const board = new CheckersBoard(); 171 | board.init(); 172 | board.moveItem('2|3', '3|3'); 173 | board.moveItem('1|3', '2|3'); 174 | board.moveItem('5|3', '4|3'); 175 | 176 | const item = board.getItem('4|3'); 177 | 178 | expect(board.getAvailableColumns('4|3', item.movement)).to.deep.equal([ 179 | '4|2', 180 | '4|4', 181 | ]); 182 | }); 183 | 184 | it('getAvailableColumns horizontal', () => { 185 | const board = new CheckersBoard(); 186 | board.init(); 187 | board.moveItem('2|3', '3|3'); 188 | board.moveItem('1|3', '2|3'); 189 | board.moveItem('5|3', '2|6'); 190 | board.removeItem('2|4'); 191 | 192 | const item = board.getItem('2|7'); 193 | 194 | expect(board.getAvailableColumns('2|7', item.movement)).to.deep.equal([ 195 | '3|7', 196 | ]); 197 | }); 198 | 199 | it('getAvailableColumns king', () => { 200 | const board = new CheckersBoard(); 201 | board.init(); 202 | 203 | const item = board.getItem('2|7'); 204 | item.setKing(); 205 | 206 | expect(board.getAvailableColumns('2|7', item.movement)).to.deep.equal([ 207 | '3|7', 208 | '4|7', 209 | ]); 210 | }); 211 | 212 | it('getAvailableColumns king with attack', () => { 213 | const board = new CheckersBoard(); 214 | board.init(); 215 | 216 | board.moveItem('5|7', '3|7'); 217 | 218 | const item = board.getItem('2|7'); 219 | item.setKing(); 220 | 221 | expect(board.getAvailableColumns('2|7', item.movement)).to.deep.equal([ 222 | '4|7', 223 | '5|7', 224 | ]); 225 | }); 226 | }); 227 | -------------------------------------------------------------------------------- /src/packages/checkers/turkish/board.ts: -------------------------------------------------------------------------------- 1 | import * as _ from 'lodash'; 2 | 3 | import getAvailableColumns from '../../../utils/getAvailableColumns'; 4 | import parseCoord from '../../../utils/parseCoord'; 5 | import Board from '../../core/board'; 6 | import { MovementType } from '../../core/item'; 7 | import Item, { CheckersColorType, CheckersItemType } from './item'; 8 | 9 | export type BoardConfig = { 10 | x: number; 11 | y: number; 12 | }; 13 | 14 | export type CheckersBoardType = { [key: string]: { item: CheckersItemType } }; 15 | 16 | export type AttactCoord = { coord: string; destroyItemCoord: string }; 17 | 18 | export type DefendCoord = { coord: string; inDangerItemCoord: string }; 19 | 20 | class TurkishCheckersBoard extends Board { 21 | board: CheckersBoardType; 22 | 23 | constructor(config: BoardConfig = { x: 8, y: 8 }) { 24 | super(config); 25 | 26 | return this; 27 | } 28 | 29 | init() { 30 | const whiteItemCoords = 31 | '1|0 1|1 1|2 1|3 1|4 1|5 1|6 1|7 2|0 2|1 2|2 2|3 2|4 2|5 2|6 2|7'; 32 | const blackItemCoords = 33 | '5|0 5|1 5|2 5|3 5|4 5|5 5|6 5|7 6|0 6|1 6|2 6|3 6|4 6|5 6|6 6|7'; 34 | 35 | whiteItemCoords.split(' ').forEach((coord) => { 36 | this.setItem(coord, new Item({ color: 'white' })); 37 | }); 38 | 39 | blackItemCoords.split(' ').forEach((coord) => { 40 | this.setItem(coord, new Item({ color: 'black' })); 41 | }); 42 | 43 | return this; 44 | } 45 | 46 | reset(): void { 47 | Object.keys(this.board).forEach(this.removeItem); 48 | 49 | this.init(); 50 | } 51 | 52 | getItemsBetweenTwoCoords(fromCoord: string, toCoord: string): string[] { 53 | const direction = this.getDirection(fromCoord, toCoord); 54 | const distance = this.getDistanceBetweenTwoCoords(fromCoord, toCoord); 55 | const convertDirection = { 56 | top: 'y', 57 | bottom: 'y', 58 | left: 'x', 59 | right: 'x', 60 | }; 61 | const stepCount = Math.abs(distance[convertDirection[direction]]) || 1; 62 | const movement = { stepCount }; 63 | 64 | movement[direction] = true; 65 | 66 | const betweenCoords = []; 67 | 68 | return betweenCoords 69 | .concat(...Object.values(getAvailableColumns(fromCoord, movement))) 70 | .filter((coord) => !this.isEmpty(coord)); 71 | } 72 | 73 | getAvailableCoordsByColor = ( 74 | color: CheckersColorType 75 | ): Record => { 76 | const currentItems = []; 77 | const availableCoords = {}; 78 | 79 | Object.entries(this.board).forEach(([coord, col]) => { 80 | if (col.item && col.item.color === color) { 81 | currentItems.push(coord); 82 | } 83 | }); 84 | 85 | currentItems.forEach((coord) => { 86 | const item = this.getItem(coord); 87 | const currentAvailableCoords = this.getAvailableColumns( 88 | coord, 89 | item.movement 90 | ); 91 | 92 | if (currentAvailableCoords.length) { 93 | availableCoords[coord] = currentAvailableCoords; 94 | } 95 | }); 96 | 97 | return availableCoords; 98 | }; 99 | 100 | getAttackCoordsByColor = ( 101 | color: CheckersColorType 102 | ): { [coord: string]: AttactCoord[] } => { 103 | const availableCoords = this.getAvailableCoordsByColor(color); 104 | const attackCoords = {}; 105 | 106 | Object.entries(availableCoords).forEach( 107 | ([coord, currentAvailableCoords]) => { 108 | currentAvailableCoords.forEach((currentAvailableCoord) => { 109 | const [destroyItemCoord] = this.getItemsBetweenTwoCoords( 110 | coord, 111 | currentAvailableCoord 112 | ); 113 | 114 | if (destroyItemCoord) { 115 | if (attackCoords[coord]) { 116 | attackCoords[coord].push({ 117 | coord: currentAvailableCoord, 118 | destroyItemCoord, 119 | }); 120 | } else { 121 | attackCoords[coord] = [ 122 | { coord: currentAvailableCoord, destroyItemCoord }, 123 | ]; 124 | } 125 | } 126 | }); 127 | } 128 | ); 129 | 130 | return attackCoords; 131 | }; 132 | 133 | getDefendCoordsByColor = ( 134 | color: CheckersColorType 135 | ): { [coord: string]: DefendCoord[] } => { 136 | const defendCoords = {}; 137 | 138 | const enemyColor = color === 'white' ? 'black' : 'white'; 139 | const availableCoords = this.getAvailableCoordsByColor(color); 140 | const enemyAttackCoords = this.getAttackCoordsByColor(enemyColor); 141 | 142 | Object.entries(enemyAttackCoords).forEach(([, enemyAttack]) => { 143 | Object.values(enemyAttack).forEach((enemyAttackCoord) => { 144 | Object.keys(availableCoords).forEach((availableItemOrigin) => { 145 | const availableColumnCoords = availableCoords[availableItemOrigin]; 146 | 147 | if ( 148 | availableColumnCoords.includes(enemyAttackCoord.coord) && 149 | availableItemOrigin !== enemyAttackCoord.destroyItemCoord 150 | ) { 151 | const defendCoordItem = { 152 | coord: enemyAttackCoord.coord, 153 | inDangerCoord: enemyAttackCoord.destroyItemCoord, 154 | }; 155 | 156 | if (defendCoords[availableItemOrigin]) { 157 | defendCoords[availableItemOrigin].push(defendCoordItem); 158 | } else { 159 | defendCoords[availableItemOrigin] = [defendCoordItem]; 160 | } 161 | } 162 | }); 163 | }); 164 | }); 165 | 166 | return defendCoords; 167 | }; 168 | 169 | getItemsByColor = (color: CheckersColorType): CheckersItemType[] => { 170 | return Object.values(this.board) 171 | .filter(({ item }) => item?.color === color) 172 | .map(({ item }) => item); 173 | }; 174 | 175 | getAvailableColumns = (coord: string, movement: MovementType): string[] => { 176 | if (this.isEmpty(coord)) return []; 177 | 178 | const columns = getAvailableColumns(coord, movement); 179 | const availableColumns: Record = {}; 180 | const captureAvailableColumns = {}; 181 | const item = this.getItem(coord); 182 | 183 | Object.keys(columns).forEach((key) => { 184 | availableColumns[key] = []; 185 | let isFoundCapture = false; 186 | 187 | for (let i = 0; i < columns[key].length; i += 1) { 188 | const currentCoord = columns[key][i]; 189 | 190 | if (!this.isExistCoord(currentCoord)) continue; 191 | if (this.isEmpty(currentCoord)) { 192 | availableColumns[key].push(currentCoord); 193 | continue; 194 | } else if (isFoundCapture) { 195 | break; 196 | } 197 | 198 | const nextCoordItem = this.getItem(currentCoord); 199 | 200 | if (nextCoordItem?.color === item.color) { 201 | break; 202 | } else if ( 203 | !isFoundCapture && 204 | nextCoordItem && 205 | nextCoordItem.color !== item.color 206 | ) { 207 | const direction = this.getDirection(coord, currentCoord); 208 | const movementRule = { 209 | stepCount: 1, 210 | [direction]: true, 211 | }; 212 | 213 | const [afterCoord] = Object.values( 214 | getAvailableColumns(currentCoord, movementRule) 215 | ) 216 | .filter((arr) => arr.length) 217 | .flat(); 218 | 219 | const afterItem = this.getItem(afterCoord); 220 | 221 | if (afterItem) break; 222 | 223 | if (this.isEmpty(afterCoord)) { 224 | availableColumns[key] = [afterCoord]; 225 | captureAvailableColumns[key] = true; 226 | isFoundCapture = true; 227 | } else { 228 | break; 229 | } 230 | } 231 | } 232 | }); 233 | 234 | const resultCoords: Record = {}; 235 | 236 | const isFoundAnySuccessDirection = Object.values( 237 | captureAvailableColumns 238 | ).some((direction) => direction); 239 | 240 | Object.keys(availableColumns).forEach((key) => { 241 | if (!isFoundAnySuccessDirection) { 242 | resultCoords[key] = _.uniq(availableColumns[key]); 243 | } else if (captureAvailableColumns[key]) { 244 | resultCoords[key] = _.uniq(availableColumns[key]); 245 | } 246 | }); 247 | 248 | return Object.values(resultCoords).flat(); 249 | }; 250 | 251 | autoPlay = (color: CheckersColorType, { onSelect, onMove }): void => { 252 | // AVAILABLE SUCCESS MOVES 253 | const availableAttacks = this.getAttackCoordsByColor(color); 254 | const availableAttacksOriginn = Object.keys(availableAttacks); 255 | 256 | if (availableAttacksOriginn.length) { 257 | const [attackOriginn] = availableAttacksOriginn; 258 | const [availableAttackColumn] = availableAttacks[attackOriginn]; 259 | 260 | onSelect?.(attackOriginn); 261 | onMove?.(attackOriginn, availableAttackColumn.coord); 262 | return; 263 | } 264 | 265 | // AVAILABLE DEFEND MOVES 266 | const potentialDefendsMoves = this.getDefendCoordsByColor(color); 267 | const potentialDefendsItem = Object.keys(potentialDefendsMoves); 268 | 269 | if (potentialDefendsItem.length) { 270 | const [defendOriginn] = potentialDefendsItem; 271 | const [availableDefendColumn] = potentialDefendsMoves[defendOriginn].map( 272 | (item) => item.coord 273 | ); 274 | 275 | onSelect?.(defendOriginn); 276 | onMove?.(defendOriginn, availableDefendColumn); 277 | return; 278 | } 279 | 280 | // AVAILABLE NORMAL MOVES 281 | const availableNormalMoves = this.getAvailableCoordsByColor(color); 282 | const availableCoords = Object.keys(availableNormalMoves); 283 | 284 | const availableEnemyNormalMoves = Object.values( 285 | this.getAvailableCoordsByColor(color === 'white' ? 'black' : 'white') 286 | ).flat(); 287 | 288 | const safeMoves = {}; 289 | 290 | Object.values(availableNormalMoves).filter((moves, index) => { 291 | moves.forEach((move) => { 292 | if (!availableEnemyNormalMoves.includes(move)) { 293 | if (safeMoves[availableCoords[index]]) { 294 | safeMoves[availableCoords[index]].push(move); 295 | } else { 296 | safeMoves[availableCoords[index]] = [move]; 297 | } 298 | } 299 | }); 300 | }); 301 | 302 | let currentCoords = availableCoords; 303 | let currentMoves = availableNormalMoves; 304 | 305 | // KING POTENTIAL 306 | const kingRowId = color === 'white' ? 7 : 0; 307 | let potentialKingItemCoord; 308 | let potentialAvailableCoord; 309 | 310 | Object.keys(currentMoves).forEach((coord) => { 311 | const availableColumns = currentMoves[coord]; 312 | 313 | availableColumns.forEach((columnCoord) => { 314 | const [rowId] = parseCoord(coord); 315 | const [moveRowId] = parseCoord(columnCoord); 316 | if (rowId !== moveRowId && moveRowId === kingRowId) { 317 | potentialKingItemCoord = coord; 318 | potentialAvailableCoord = columnCoord; 319 | } 320 | }); 321 | }); 322 | 323 | if (potentialKingItemCoord && potentialAvailableCoord) { 324 | onSelect?.(potentialKingItemCoord); 325 | onMove?.(potentialKingItemCoord, potentialAvailableCoord); 326 | return; 327 | } 328 | 329 | const safeCoords = Object.keys(safeMoves); 330 | 331 | if (safeCoords.length) { 332 | currentCoords = safeCoords; 333 | currentMoves = safeMoves; 334 | } 335 | 336 | // RISK ESTIMATION 337 | currentCoords.forEach((currentCoord) => { 338 | currentMoves[currentCoord].forEach((move) => { 339 | const riskEstimationBoard = new TurkishCheckersBoard().updateBoard( 340 | JSON.parse(JSON.stringify(this.board)) 341 | ); 342 | 343 | riskEstimationBoard.moveItem(currentCoord, move); 344 | 345 | const potentialDefendColumns = 346 | riskEstimationBoard.getDefendCoordsByColor(color); 347 | 348 | if (Object.values(potentialDefendColumns).flat().length) { 349 | currentMoves[currentCoord] = currentMoves[currentCoord].filter( 350 | (mv) => mv !== move 351 | ); 352 | } 353 | }); 354 | 355 | if (!currentMoves[currentCoord].length) { 356 | currentCoords = currentCoords.filter((c) => c !== currentCoord); 357 | delete currentMoves[currentCoord]; 358 | } 359 | }); 360 | 361 | // PROPENSITY TO MOVE FORWARD 362 | currentCoords.forEach((currentCoord) => { 363 | currentMoves[currentCoord].sort((first, second) => { 364 | const [firstRowId] = parseCoord(first); 365 | const [secondRowId] = parseCoord(second); 366 | 367 | if (firstRowId > secondRowId) { 368 | return -1; 369 | } else if (firstRowId < secondRowId) { 370 | return 1; 371 | } else { 372 | return 0; 373 | } 374 | }); 375 | }); 376 | 377 | // [TODO]: No random, use foward move 378 | const randomIndex = Math.floor(Math.random() * currentCoords.length); 379 | const selectedCoord = currentCoords[randomIndex]; 380 | 381 | const moveCoord = currentMoves[selectedCoord]?.[0]; 382 | 383 | onSelect?.(selectedCoord); 384 | onMove?.(selectedCoord, moveCoord); 385 | }; 386 | } 387 | 388 | export default TurkishCheckersBoard; 389 | -------------------------------------------------------------------------------- /src/packages/checkers/turkish/index.ts: -------------------------------------------------------------------------------- 1 | import Board from './board'; 2 | import Item from './item'; 3 | 4 | export default { Board, Item }; 5 | -------------------------------------------------------------------------------- /src/packages/checkers/turkish/item.ts: -------------------------------------------------------------------------------- 1 | import Item, { ItemType, MovementType } from '../../core/item'; 2 | import { CHECKERS_WHITE, CHECKERS_BLACK } from '../constant'; 3 | 4 | export type CheckersColorType = typeof CHECKERS_BLACK | typeof CHECKERS_WHITE; 5 | 6 | export interface CheckersItemType extends ItemType { 7 | color: CheckersColorType; 8 | king: boolean; 9 | } 10 | 11 | class CheckersItem extends Item implements CheckersItemType { 12 | color: CheckersColorType; 13 | 14 | king: boolean; 15 | 16 | movement: MovementType = {}; 17 | 18 | constructor(item) { 19 | super(item); 20 | 21 | this.color = item.color || CHECKERS_BLACK; 22 | this.king = item.king || false; 23 | this.movement = item.movement || {}; 24 | 25 | if (item.king) { 26 | this.movement.linear = true; 27 | this.movement.stepCount = 7; 28 | } else { 29 | const isBlack = this.color === CHECKERS_BLACK; 30 | this.movement[isBlack ? 'top' : 'bottom'] = true; 31 | this.movement.left = true; 32 | this.movement.right = true; 33 | } 34 | } 35 | 36 | // TODO: Write Test 37 | setKing(): void { 38 | this.movement = { 39 | linear: true, 40 | stepCount: 7, 41 | }; 42 | 43 | this.king = true; 44 | } 45 | } 46 | 47 | export default CheckersItem; 48 | -------------------------------------------------------------------------------- /src/packages/core/board.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import 'mocha'; 3 | 4 | import Board from './board'; 5 | import Item from './item'; 6 | 7 | describe('Core Board', () => { 8 | it('Board 3x3', () => { 9 | const { board } = new Board({ x: 3, y: 3 }); 10 | 11 | expect(board).to.deep.equal({ 12 | '0|0': { item: null }, 13 | '0|1': { item: null }, 14 | '0|2': { item: null }, 15 | '1|0': { item: null }, 16 | '1|1': { item: null }, 17 | '1|2': { item: null }, 18 | '2|0': { item: null }, 19 | '2|1': { item: null }, 20 | '2|2': { item: null }, 21 | }); 22 | }); 23 | 24 | it('Board 3x5', () => { 25 | const { board } = new Board({ x: 3, y: 5 }); 26 | 27 | expect(board).to.deep.equal({ 28 | '0|0': { item: null }, 29 | '0|1': { item: null }, 30 | '0|2': { item: null }, 31 | '0|3': { item: null }, 32 | '0|4': { item: null }, 33 | '1|0': { item: null }, 34 | '1|1': { item: null }, 35 | '1|2': { item: null }, 36 | '1|3': { item: null }, 37 | '1|4': { item: null }, 38 | '2|0': { item: null }, 39 | '2|1': { item: null }, 40 | '2|2': { item: null }, 41 | '2|3': { item: null }, 42 | '2|4': { item: null }, 43 | }); 44 | }); 45 | 46 | it('Board 5x3', () => { 47 | const { board } = new Board({ x: 5, y: 3 }); 48 | 49 | expect(board).to.deep.equal({ 50 | '0|0': { item: null }, 51 | '0|1': { item: null }, 52 | '0|2': { item: null }, 53 | '1|0': { item: null }, 54 | '1|1': { item: null }, 55 | '1|2': { item: null }, 56 | '2|0': { item: null }, 57 | '2|1': { item: null }, 58 | '2|2': { item: null }, 59 | '3|0': { item: null }, 60 | '3|1': { item: null }, 61 | '3|2': { item: null }, 62 | '4|0': { item: null }, 63 | '4|1': { item: null }, 64 | '4|2': { item: null }, 65 | }); 66 | }); 67 | 68 | it('setItem', () => { 69 | const board = new Board({ x: 3, y: 3 }); 70 | const item = new Item({ 71 | rules: { 72 | movement: { 73 | angular: true, 74 | linear: true, 75 | stepCount: 4, 76 | }, 77 | }, 78 | }); 79 | 80 | board.setItem('0|1', item); 81 | 82 | expect(board.board).to.deep.equal({ 83 | '0|0': { item: null }, 84 | '0|1': { item }, 85 | '0|2': { item: null }, 86 | '1|0': { item: null }, 87 | '1|1': { item: null }, 88 | '1|2': { item: null }, 89 | '2|0': { item: null }, 90 | '2|1': { item: null }, 91 | '2|2': { item: null }, 92 | }); 93 | }); 94 | 95 | it('getItem', () => { 96 | const board = new Board({ x: 3, y: 3 }); 97 | const item = new Item({ 98 | rules: { 99 | movement: { 100 | angular: true, 101 | linear: true, 102 | stepCount: 4, 103 | }, 104 | }, 105 | }); 106 | 107 | board.setItem('0|1', item); 108 | const result = board.getItem('0|1'); 109 | 110 | expect(result).to.deep.equal(item); 111 | }); 112 | 113 | it('removeItem', () => { 114 | const board = new Board({ x: 3, y: 3 }); 115 | const item = new Item({ 116 | rules: { 117 | movement: { 118 | angular: true, 119 | linear: true, 120 | stepCount: 4, 121 | }, 122 | }, 123 | }); 124 | 125 | board.setItem('0|1', item); 126 | board.removeItem('0|1'); 127 | const result = board.getItem('0|1'); 128 | 129 | expect(result).to.deep.equal(null); 130 | }); 131 | 132 | it('moveItem', () => { 133 | const board = new Board({ x: 3, y: 3 }); 134 | const item = new Item({ 135 | rules: { 136 | movement: { 137 | angular: true, 138 | linear: true, 139 | stepCount: 4, 140 | }, 141 | }, 142 | }); 143 | 144 | board.setItem('0|1', item); 145 | board.moveItem('0|1', '1|1'); 146 | 147 | expect(board.board).to.deep.equal({ 148 | '0|0': { item: null }, 149 | '0|1': { item: null }, 150 | '0|2': { item: null }, 151 | '1|0': { item: null }, 152 | '1|1': { item }, 153 | '1|2': { item: null }, 154 | '2|0': { item: null }, 155 | '2|1': { item: null }, 156 | '2|2': { item: null }, 157 | }); 158 | }); 159 | 160 | it('switchItem', () => { 161 | const board = new Board({ x: 3, y: 3 }); 162 | const firstItem = new Item({ 163 | data: { 164 | color: 'black', 165 | }, 166 | rules: { 167 | movement: { 168 | angular: true, 169 | linear: true, 170 | stepCount: 4, 171 | }, 172 | }, 173 | }); 174 | 175 | const secondItem = new Item({ 176 | data: { 177 | color: 'white', 178 | }, 179 | rules: { 180 | movement: { 181 | angular: true, 182 | linear: true, 183 | stepCount: 4, 184 | }, 185 | }, 186 | }); 187 | 188 | board.setItem('0|1', firstItem); 189 | board.setItem('1|1', secondItem); 190 | board.switchItem('0|1', '1|1'); 191 | 192 | expect(board.board).to.deep.equal({ 193 | '0|0': { item: null }, 194 | '0|1': { item: secondItem }, 195 | '0|2': { item: null }, 196 | '1|0': { item: null }, 197 | '1|1': { item: firstItem }, 198 | '1|2': { item: null }, 199 | '2|0': { item: null }, 200 | '2|1': { item: null }, 201 | '2|2': { item: null }, 202 | }); 203 | }); 204 | 205 | it('selectItem', () => { 206 | const board = new Board({ x: 3, y: 3 }); 207 | const item = new Item({ 208 | rules: { 209 | movement: { 210 | angular: true, 211 | linear: true, 212 | stepCount: 4, 213 | }, 214 | }, 215 | }); 216 | 217 | board.setItem('0|1', { ...item }); 218 | board.selectItem('0|1'); 219 | 220 | expect(board.board).to.deep.equal({ 221 | '0|0': { item: null }, 222 | '0|1': { item: { ...item, selected: true } }, 223 | '0|2': { item: null }, 224 | '1|0': { item: null }, 225 | '1|1': { item: null }, 226 | '1|2': { item: null }, 227 | '2|0': { item: null }, 228 | '2|1': { item: null }, 229 | '2|2': { item: null }, 230 | }); 231 | }); 232 | 233 | it('deselectItem', () => { 234 | const board = new Board({ x: 3, y: 3 }); 235 | const item = new Item({ 236 | rules: { 237 | movement: { 238 | angular: true, 239 | linear: true, 240 | stepCount: 4, 241 | }, 242 | }, 243 | }); 244 | 245 | board.setItem('0|1', { ...item }); 246 | board.selectItem('0|1'); 247 | board.deselectItem('0|1'); 248 | 249 | expect(board.board).to.deep.equal({ 250 | '0|0': { item: null }, 251 | '0|1': { item: { ...item, selected: false } }, 252 | '0|2': { item: null }, 253 | '1|0': { item: null }, 254 | '1|1': { item: null }, 255 | '1|2': { item: null }, 256 | '2|0': { item: null }, 257 | '2|1': { item: null }, 258 | '2|2': { item: null }, 259 | }); 260 | }); 261 | 262 | it('deselectAllItems', () => { 263 | const board = new Board({ x: 3, y: 3 }); 264 | const item = new Item({ 265 | rules: { 266 | movement: { 267 | angular: true, 268 | linear: true, 269 | stepCount: 4, 270 | }, 271 | }, 272 | }); 273 | 274 | board.setItem('0|1', { ...item }); 275 | board.selectItem('0|1'); 276 | board.deselectAllItems(); 277 | 278 | expect(board.board).to.deep.equal({ 279 | '0|0': { item: null }, 280 | '0|1': { item }, 281 | '0|2': { item: null }, 282 | '1|0': { item: null }, 283 | '1|1': { item: null }, 284 | '1|2': { item: null }, 285 | '2|0': { item: null }, 286 | '2|1': { item: null }, 287 | '2|2': { item: null }, 288 | }); 289 | }); 290 | 291 | it('getDistanceBetweenTwoCoords', () => { 292 | const board = new Board({ x: 3, y: 3 }); 293 | const distance = board.getDistanceBetweenTwoCoords('0|0', '1|1'); 294 | 295 | expect(distance).to.deep.equal({ x: 1, y: 1 }); 296 | }); 297 | 298 | it('isEmpty', () => { 299 | const board = new Board({ x: 3, y: 3 }); 300 | const item = new Item({ 301 | rules: { 302 | movement: { 303 | angular: true, 304 | linear: true, 305 | stepCount: 4, 306 | }, 307 | }, 308 | }); 309 | 310 | board.setItem('0|1', item); 311 | 312 | const firstIsEmpty = board.isEmpty('0|1'); 313 | const secondIsEmpty = board.isEmpty('1|1'); 314 | 315 | expect(firstIsEmpty).to.equal(false); 316 | expect(secondIsEmpty).to.equal(true); 317 | }); 318 | 319 | it('isExistCoord', () => { 320 | const board = new Board({ x: 3, y: 3 }); 321 | 322 | expect(board.isExistCoord('0|0')).to.equal(true); 323 | expect(board.isExistCoord('4|4')).to.equal(false); 324 | }); 325 | 326 | it('getDistanceBetweenTwoCoords', () => { 327 | const board = new Board({ x: 3, y: 3 }); 328 | 329 | expect(board.getDistanceBetweenTwoCoords('0|0', '0|1')).to.deep.equal({ 330 | y: 0, 331 | x: 1, 332 | }); 333 | 334 | expect(board.getDistanceBetweenTwoCoords('0|0', '1|0')).to.deep.equal({ 335 | y: 1, 336 | x: 0, 337 | }); 338 | 339 | expect(board.getDistanceBetweenTwoCoords('0|0', '1|1')).to.deep.equal({ 340 | y: 1, 341 | x: 1, 342 | }); 343 | 344 | expect(board.getDistanceBetweenTwoCoords('1|1', '0|0')).to.deep.equal({ 345 | y: -1, 346 | x: -1, 347 | }); 348 | }); 349 | 350 | it('getDirection', () => { 351 | const board = new Board({ x: 3, y: 3 }); 352 | 353 | expect(board.getDirection('0|0', '0|1')).to.equal('right'); 354 | 355 | expect(board.getDirection('0|0', '1|0')).to.equal('bottom'); 356 | 357 | expect(board.getDirection('0|0', '1|1')).to.equal('bottomRight'); 358 | 359 | expect(board.getDirection('1|1', '0|0')).to.equal('topLeft'); 360 | }); 361 | }); 362 | 363 | describe('Core Board Available Columns', () => { 364 | it('getAvailableColumns -top for "1|1" on 3x3 Board', () => { 365 | const availableColumn = new Board({ x: 3, y: 3 }).getAvailableColumns( 366 | '1|1', 367 | { 368 | top: true, 369 | stepCount: 1, 370 | } 371 | ); 372 | 373 | expect(availableColumn).to.deep.equal(['0|1']); 374 | }); 375 | 376 | it('getAvailableColumns -bottom for "1|1" on 3x3 Board', () => { 377 | const availableColumn = new Board({ x: 3, y: 3 }).getAvailableColumns( 378 | '1|1', 379 | { 380 | bottom: true, 381 | stepCount: 1, 382 | } 383 | ); 384 | 385 | expect(availableColumn).to.deep.equal(['2|1']); 386 | }); 387 | 388 | it('getAvailableColumns -left for "1|1" on 3x3 Board', () => { 389 | const availableColumn = new Board({ x: 3, y: 3 }).getAvailableColumns( 390 | '1|1', 391 | { 392 | left: true, 393 | stepCount: 1, 394 | } 395 | ); 396 | 397 | expect(availableColumn).to.deep.equal(['1|0']); 398 | }); 399 | 400 | it('getAvailableColumns -right for "1|1" on 3x3 Board', () => { 401 | const availableColumn = new Board({ x: 3, y: 3 }).getAvailableColumns( 402 | '1|1', 403 | { 404 | right: true, 405 | stepCount: 1, 406 | } 407 | ); 408 | 409 | expect(availableColumn).to.deep.equal(['1|2']); 410 | }); 411 | 412 | it('getAvailableColumns -linear for "1|1" on 3x3 Board', () => { 413 | const availableColumn = new Board({ x: 3, y: 3 }).getAvailableColumns( 414 | '1|1', 415 | { 416 | stepCount: 1, 417 | linear: true, 418 | } 419 | ); 420 | 421 | expect(availableColumn).to.deep.equal(['0|1', '2|1', '1|0', '1|2']); 422 | }); 423 | 424 | it('getAvailableColumns -angular for "1|1" on 3x3 Board', () => { 425 | const availableColumn = new Board({ x: 3, y: 3 }).getAvailableColumns( 426 | '1|1', 427 | { 428 | stepCount: 1, 429 | angular: true, 430 | } 431 | ); 432 | 433 | expect(availableColumn).to.deep.equal(['0|0', '0|2', '2|0', '2|2']); 434 | }); 435 | }); 436 | -------------------------------------------------------------------------------- /src/packages/core/board.ts: -------------------------------------------------------------------------------- 1 | import getAvailableColumns from '../../utils/getAvailableColumns'; 2 | import parseCoord from '../../utils/parseCoord'; 3 | import { ItemType, MovementType } from './item'; 4 | 5 | export type DistanceType = { 6 | x: number; 7 | y: number; 8 | }; 9 | 10 | export type BoardConfig = { 11 | x: number; 12 | y: number; 13 | }; 14 | 15 | export type ColumnType = { 16 | item: ItemType; 17 | }; 18 | 19 | export type BoardType = { 20 | [key: string]: ColumnType; 21 | }; 22 | 23 | export type Direction = 24 | | 'bottomLeft' 25 | | 'bottomRight' 26 | | 'topLeft' 27 | | 'topRight' 28 | | 'right' 29 | | 'left' 30 | | 'top' 31 | | 'bottom'; 32 | 33 | export type BoardMatrixItem = { 34 | coord: string; 35 | item: ItemType; 36 | }; 37 | 38 | class Board { 39 | config: BoardConfig; 40 | 41 | board: BoardType = {}; 42 | 43 | constructor(config: BoardConfig) { 44 | const board = Board.createBoard(config); 45 | 46 | this.config = config; 47 | this.board = board; 48 | 49 | return this; 50 | } 51 | 52 | static createBoard = (config: BoardConfig): BoardType => { 53 | const { x, y } = config; 54 | const board: BoardType = {}; 55 | 56 | for (let rowIndex = 0; rowIndex < x; rowIndex += 1) { 57 | for (let colIndex = 0; colIndex < y; colIndex += 1) { 58 | board[`${rowIndex}|${colIndex}`] = { item: null }; 59 | } 60 | } 61 | 62 | return board; 63 | }; 64 | 65 | updateBoard = (board: BoardType) => { 66 | this.board = board; 67 | return this; 68 | }; 69 | 70 | getBoardMatrix = (): BoardMatrixItem[][] => { 71 | const matrix = []; 72 | 73 | Object.entries(this.board).forEach(([coord, data]) => { 74 | const [rowId, colId] = parseCoord(coord); 75 | const item = { coord, ...data }; 76 | 77 | if (matrix[rowId]) { 78 | matrix[rowId][colId] = item; 79 | } else { 80 | matrix[rowId] = [item]; 81 | } 82 | }); 83 | 84 | return matrix; 85 | }; 86 | 87 | getItem = (coord: string): ItemType => { 88 | const isExistCoord = this.isExistCoord(coord); 89 | 90 | if (!isExistCoord) return null; 91 | 92 | return this.board[coord].item; 93 | }; 94 | 95 | setItem = (coord: string, item: ItemType): void => { 96 | const isExistCoord = this.isExistCoord(coord); 97 | 98 | if (!isExistCoord) return; 99 | 100 | this.board[coord].item = item; 101 | }; 102 | 103 | removeItem = (coord: string): void => { 104 | const isExistCoord = this.isExistCoord(coord); 105 | 106 | if (!isExistCoord) return; 107 | 108 | this.board[coord].item = null; 109 | }; 110 | 111 | moveItem = (fromCoord: string, toCoord: string): void => { 112 | const isExistFromCoord = this.isExistCoord(fromCoord); 113 | const isExistToCoord = this.isExistCoord(toCoord); 114 | 115 | if (!isExistFromCoord || !isExistToCoord) return; 116 | 117 | const { item } = this.board[fromCoord]; 118 | this.board[fromCoord].item = null; 119 | this.board[toCoord].item = item; 120 | }; 121 | 122 | switchItem = (fromCoord: string, toCoord: string): void => { 123 | const isExistFromCoord = this.isExistCoord(fromCoord); 124 | const isExistToCoord = this.isExistCoord(toCoord); 125 | 126 | if (!isExistFromCoord || !isExistToCoord) return; 127 | 128 | const { item: fromItem } = this.board[fromCoord]; 129 | const { item: toItem } = this.board[toCoord]; 130 | 131 | this.board[fromCoord].item = toItem; 132 | this.board[toCoord].item = fromItem; 133 | }; 134 | 135 | selectItem = (coord: string): void => { 136 | const isExistCoord = this.isExistCoord(coord); 137 | 138 | if (!isExistCoord) return; 139 | 140 | const { item } = this.board[coord]; 141 | 142 | if (item) { 143 | item.selected = true; 144 | } 145 | }; 146 | 147 | deselectItem = (coord: string): void => { 148 | const isExistCoord = this.isExistCoord(coord); 149 | 150 | if (!isExistCoord) return; 151 | 152 | const { item } = this.board[coord]; 153 | 154 | if (item) { 155 | item.selected = false; 156 | } 157 | }; 158 | 159 | deselectAllItems = (): void => { 160 | Object.keys(this.board).forEach((coord) => { 161 | const { item } = this.board[coord]; 162 | if (item) { 163 | item.selected = false; 164 | } 165 | }); 166 | }; 167 | 168 | isEmpty = (coord: string): boolean => { 169 | const isExistCoord = this.isExistCoord(coord); 170 | 171 | if (!isExistCoord) return; 172 | 173 | return !this.board[coord].item; 174 | }; 175 | 176 | isExistCoord = (coord: string): boolean => !!this.board[coord]; 177 | 178 | getDistanceBetweenTwoCoords = ( 179 | fromCoord: string, 180 | toCoord: string 181 | ): DistanceType => { 182 | const isExistFromCoord = this.isExistCoord(fromCoord); 183 | const isExistToCoord = this.isExistCoord(toCoord); 184 | 185 | if (!isExistFromCoord || !isExistToCoord) return; 186 | 187 | const [fromRowId, fromColId] = parseCoord(fromCoord); 188 | const [toRowId, toColId] = parseCoord(toCoord); 189 | 190 | return { y: toRowId - fromRowId, x: toColId - fromColId }; 191 | }; 192 | 193 | getDirection = (fromCoord: string, toCoord: string): Direction => { 194 | const isExistFromCoord = this.isExistCoord(fromCoord); 195 | const isExistToCoord = this.isExistCoord(toCoord); 196 | 197 | if (!isExistFromCoord || !isExistToCoord) return; 198 | 199 | const [fromRowId, fromColId] = parseCoord(fromCoord); 200 | const [toRowId, toColId] = parseCoord(toCoord); 201 | 202 | if (fromColId > toColId && fromRowId < toRowId) return 'bottomLeft'; 203 | if (fromColId < toColId && fromRowId < toRowId) return 'bottomRight'; 204 | if (fromColId > toColId && fromRowId > toRowId) return 'topLeft'; 205 | if (fromColId < toColId && fromRowId > toRowId) return 'topRight'; 206 | if (fromColId < toColId && fromRowId === toRowId) return 'right'; 207 | if (fromColId > toColId && fromRowId === toRowId) return 'left'; 208 | if (fromColId === toColId && fromRowId > toRowId) return 'top'; 209 | if (fromColId === toColId && fromRowId < toRowId) return 'bottom'; 210 | 211 | return null; 212 | }; 213 | 214 | getAvailableColumns = ( 215 | coord: string, 216 | movement: MovementType, 217 | columnsObj?: boolean 218 | ): string[] | { [key: string]: string[] } => { 219 | const avaiblableColumns = []; 220 | const columns = getAvailableColumns(coord, movement); 221 | 222 | if (columnsObj) return columns; 223 | 224 | return avaiblableColumns 225 | .concat(...Object.values(columns)) 226 | .filter(this.isExistCoord); 227 | }; 228 | } 229 | 230 | export default Board; 231 | -------------------------------------------------------------------------------- /src/packages/core/index.ts: -------------------------------------------------------------------------------- 1 | import Board from './board'; 2 | import Item from './item'; 3 | 4 | export default { Board, Item }; 5 | -------------------------------------------------------------------------------- /src/packages/core/item.ts: -------------------------------------------------------------------------------- 1 | export type MovementType = { 2 | top?: boolean; 3 | bottom?: boolean; 4 | left?: boolean; 5 | right?: boolean; 6 | topLeft?: boolean; 7 | topRight?: boolean; 8 | bottomLeft?: boolean; 9 | bottomRight?: boolean; 10 | angular?: boolean; 11 | linear?: boolean; 12 | stepCount?: number; 13 | }; 14 | 15 | export type ItemType = { 16 | name: string; 17 | lock: boolean; 18 | selected: boolean; 19 | movement: MovementType; 20 | [key: string]: any; 21 | }; 22 | 23 | class Item { 24 | name: string; 25 | 26 | data: any; 27 | 28 | lock = false; 29 | 30 | selected = false; 31 | 32 | movement: MovementType = {}; 33 | 34 | constructor(item) { 35 | this.data = item.data; 36 | this.name = item.name || this.name; 37 | this.lock = item.lock || this.lock; 38 | this.selected = item.selected || this.selected; 39 | this.movement = item.movement || this.movement; 40 | } 41 | } 42 | 43 | export default Item; 44 | -------------------------------------------------------------------------------- /src/utils/getAvailableColumns.ts: -------------------------------------------------------------------------------- 1 | import { MovementType } from '../packages/core/item'; 2 | import parseCoord from './parseCoord'; 3 | 4 | const getAvailableColumns = ( 5 | coord: string, 6 | movement: MovementType 7 | ): { [key: string]: string[] } => { 8 | const [rowId, colId] = parseCoord(coord); 9 | 10 | const columns = { 11 | top: [], 12 | bottom: [], 13 | left: [], 14 | right: [], 15 | topLeft: [], 16 | topRight: [], 17 | bottomLeft: [], 18 | bottomRight: [], 19 | }; 20 | 21 | const stepCount = movement?.stepCount || 1; 22 | 23 | for (let step = 1; step <= stepCount; step += 1) { 24 | if (movement?.top) { 25 | columns.top.push(`${rowId - step}|${colId}`); 26 | } 27 | if (movement?.bottom) { 28 | columns.bottom.push(`${rowId + step}|${colId}`); 29 | } 30 | if (movement?.left) { 31 | columns.left.push(`${rowId}|${colId - step}`); 32 | } 33 | if (movement?.right) { 34 | columns.right.push(`${rowId}|${colId + step}`); 35 | } 36 | if (movement?.topRight) { 37 | columns.topRight.push(`${rowId - step}|${colId + step}`); 38 | } 39 | if (movement?.topLeft) { 40 | columns.topLeft.push(`${rowId - step}|${colId - step}`); 41 | } 42 | if (movement?.bottomRight) { 43 | columns.bottomRight.push(`${rowId + step}|${colId + step}`); 44 | } 45 | if (movement?.bottomLeft) { 46 | columns.bottomLeft.push(`${rowId + step}|${colId - step}`); 47 | } 48 | if (movement?.linear) { 49 | columns.top.push(`${rowId - step}|${colId}`); 50 | columns.bottom.push(`${rowId + step}|${colId}`); 51 | columns.left.push(`${rowId}|${colId - step}`); 52 | columns.right.push(`${rowId}|${colId + step}`); 53 | } 54 | if (movement?.angular) { 55 | columns.topLeft.push(`${rowId - step}|${colId - step}`); 56 | columns.topRight.push(`${rowId - step}|${colId + step}`); 57 | columns.bottomLeft.push(`${rowId + step}|${colId - step}`); 58 | columns.bottomRight.push(`${rowId + step}|${colId + step}`); 59 | } 60 | } 61 | 62 | return columns; 63 | }; 64 | 65 | export default getAvailableColumns; 66 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | import parseCoord from './parseCoord'; 2 | 3 | export default { parseCoord }; 4 | -------------------------------------------------------------------------------- /src/utils/parseCoord.ts: -------------------------------------------------------------------------------- 1 | const parseCoord = (coord: string): number[] => 2 | coord.split('|').map((n) => parseInt(n, 10)); 3 | 4 | export default parseCoord; 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "target": "es5", 5 | "module": "commonjs", 6 | "moduleResolution": "node", 7 | "sourceMap": false, 8 | "experimentalDecorators": true, 9 | "lib": ["dom", "es6", "es5", "es2017", "es2019"] 10 | }, 11 | "include": ["./src/**/*"], 12 | "exclude": ["./test/**/*"], 13 | "compileOnSave": false 14 | } 15 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@eslint/eslintrc@^1.3.0": 13 | version "1.3.0" 14 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" 15 | integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== 16 | dependencies: 17 | ajv "^6.12.4" 18 | debug "^4.3.2" 19 | espree "^9.3.2" 20 | globals "^13.15.0" 21 | ignore "^5.2.0" 22 | import-fresh "^3.2.1" 23 | js-yaml "^4.1.0" 24 | minimatch "^3.1.2" 25 | strip-json-comments "^3.1.1" 26 | 27 | "@humanwhocodes/config-array@^0.10.4": 28 | version "0.10.4" 29 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" 30 | integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== 31 | dependencies: 32 | "@humanwhocodes/object-schema" "^1.2.1" 33 | debug "^4.1.1" 34 | minimatch "^3.0.4" 35 | 36 | "@humanwhocodes/gitignore-to-minimatch@^1.0.2": 37 | version "1.0.2" 38 | resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" 39 | integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== 40 | 41 | "@humanwhocodes/object-schema@^1.2.1": 42 | version "1.2.1" 43 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 44 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 45 | 46 | "@jest/schemas@^28.1.3": 47 | version "28.1.3" 48 | resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" 49 | integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== 50 | dependencies: 51 | "@sinclair/typebox" "^0.24.1" 52 | 53 | "@jridgewell/resolve-uri@^3.0.3": 54 | version "3.1.0" 55 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 56 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 57 | 58 | "@jridgewell/sourcemap-codec@^1.4.10": 59 | version "1.4.14" 60 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 61 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 62 | 63 | "@jridgewell/trace-mapping@0.3.9": 64 | version "0.3.9" 65 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 66 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 67 | dependencies: 68 | "@jridgewell/resolve-uri" "^3.0.3" 69 | "@jridgewell/sourcemap-codec" "^1.4.10" 70 | 71 | "@nodelib/fs.scandir@2.1.5": 72 | version "2.1.5" 73 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 74 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 75 | dependencies: 76 | "@nodelib/fs.stat" "2.0.5" 77 | run-parallel "^1.1.9" 78 | 79 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 80 | version "2.0.5" 81 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 82 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 83 | 84 | "@nodelib/fs.walk@^1.2.3": 85 | version "1.2.8" 86 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 87 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 88 | dependencies: 89 | "@nodelib/fs.scandir" "2.1.5" 90 | fastq "^1.6.0" 91 | 92 | "@sinclair/typebox@^0.24.1": 93 | version "0.24.22" 94 | resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.22.tgz#0da18e6e75701d6609c7c68fe18002bb1f47345f" 95 | integrity sha512-JsBe3cOFpNZ6yjBYnXKhcENWy5qZE3PQZwExQ5ksA/h8qp4bwwxFmy07A6bC2R6qv6+RF3SfrbQTskTwYNTXUQ== 96 | 97 | "@tootallnate/once@2": 98 | version "2.0.0" 99 | resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" 100 | integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== 101 | 102 | "@tsconfig/node10@^1.0.7": 103 | version "1.0.9" 104 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 105 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 106 | 107 | "@tsconfig/node12@^1.0.7": 108 | version "1.0.11" 109 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 110 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 111 | 112 | "@tsconfig/node14@^1.0.0": 113 | version "1.0.3" 114 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 115 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 116 | 117 | "@tsconfig/node16@^1.0.2": 118 | version "1.0.3" 119 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 120 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 121 | 122 | "@types/chai@^4.2.15": 123 | version "4.3.1" 124 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" 125 | integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== 126 | 127 | "@types/jest@^28.1.6": 128 | version "28.1.6" 129 | resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.6.tgz#d6a9cdd38967d2d746861fb5be6b120e38284dd4" 130 | integrity sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ== 131 | dependencies: 132 | jest-matcher-utils "^28.0.0" 133 | pretty-format "^28.0.0" 134 | 135 | "@types/json-schema@^7.0.9": 136 | version "7.0.11" 137 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" 138 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 139 | 140 | "@typescript-eslint/eslint-plugin@^5.32.0": 141 | version "5.32.0" 142 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.32.0.tgz#e27e38cffa4a61226327c874a7be965e9a861624" 143 | integrity sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew== 144 | dependencies: 145 | "@typescript-eslint/scope-manager" "5.32.0" 146 | "@typescript-eslint/type-utils" "5.32.0" 147 | "@typescript-eslint/utils" "5.32.0" 148 | debug "^4.3.4" 149 | functional-red-black-tree "^1.0.1" 150 | ignore "^5.2.0" 151 | regexpp "^3.2.0" 152 | semver "^7.3.7" 153 | tsutils "^3.21.0" 154 | 155 | "@typescript-eslint/parser@^5.32.0": 156 | version "5.32.0" 157 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.32.0.tgz#1de243443bc6186fb153b9e395b842e46877ca5d" 158 | integrity sha512-IxRtsehdGV9GFQ35IGm5oKKR2OGcazUoiNBxhRV160iF9FoyuXxjY+rIqs1gfnd+4eL98OjeGnMpE7RF/NBb3A== 159 | dependencies: 160 | "@typescript-eslint/scope-manager" "5.32.0" 161 | "@typescript-eslint/types" "5.32.0" 162 | "@typescript-eslint/typescript-estree" "5.32.0" 163 | debug "^4.3.4" 164 | 165 | "@typescript-eslint/scope-manager@5.32.0": 166 | version "5.32.0" 167 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.32.0.tgz#763386e963a8def470580cc36cf9228864190b95" 168 | integrity sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg== 169 | dependencies: 170 | "@typescript-eslint/types" "5.32.0" 171 | "@typescript-eslint/visitor-keys" "5.32.0" 172 | 173 | "@typescript-eslint/type-utils@5.32.0": 174 | version "5.32.0" 175 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.32.0.tgz#45a14506fe3fb908600b4cef2f70778f7b5cdc79" 176 | integrity sha512-0gSsIhFDduBz3QcHJIp3qRCvVYbqzHg8D6bHFsDMrm0rURYDj+skBK2zmYebdCp+4nrd9VWd13egvhYFJj/wZg== 177 | dependencies: 178 | "@typescript-eslint/utils" "5.32.0" 179 | debug "^4.3.4" 180 | tsutils "^3.21.0" 181 | 182 | "@typescript-eslint/types@5.32.0": 183 | version "5.32.0" 184 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.32.0.tgz#484273021eeeae87ddb288f39586ef5efeb6dcd8" 185 | integrity sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ== 186 | 187 | "@typescript-eslint/typescript-estree@5.32.0": 188 | version "5.32.0" 189 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.32.0.tgz#282943f34babf07a4afa7b0ff347a8e7b6030d12" 190 | integrity sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg== 191 | dependencies: 192 | "@typescript-eslint/types" "5.32.0" 193 | "@typescript-eslint/visitor-keys" "5.32.0" 194 | debug "^4.3.4" 195 | globby "^11.1.0" 196 | is-glob "^4.0.3" 197 | semver "^7.3.7" 198 | tsutils "^3.21.0" 199 | 200 | "@typescript-eslint/utils@5.32.0": 201 | version "5.32.0" 202 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.32.0.tgz#eccb6b672b94516f1afc6508d05173c45924840c" 203 | integrity sha512-W7lYIAI5Zlc5K082dGR27Fczjb3Q57ECcXefKU/f0ajM5ToM0P+N9NmJWip8GmGu/g6QISNT+K6KYB+iSHjXCQ== 204 | dependencies: 205 | "@types/json-schema" "^7.0.9" 206 | "@typescript-eslint/scope-manager" "5.32.0" 207 | "@typescript-eslint/types" "5.32.0" 208 | "@typescript-eslint/typescript-estree" "5.32.0" 209 | eslint-scope "^5.1.1" 210 | eslint-utils "^3.0.0" 211 | 212 | "@typescript-eslint/visitor-keys@5.32.0": 213 | version "5.32.0" 214 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.32.0.tgz#b9715d0b11fdb5dd10fd0c42ff13987470525394" 215 | integrity sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g== 216 | dependencies: 217 | "@typescript-eslint/types" "5.32.0" 218 | eslint-visitor-keys "^3.3.0" 219 | 220 | "@ungap/promise-all-settled@1.1.2": 221 | version "1.1.2" 222 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 223 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 224 | 225 | abab@^2.0.6: 226 | version "2.0.6" 227 | resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" 228 | integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== 229 | 230 | acorn-globals@^6.0.0: 231 | version "6.0.0" 232 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" 233 | integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== 234 | dependencies: 235 | acorn "^7.1.1" 236 | acorn-walk "^7.1.1" 237 | 238 | acorn-jsx@^5.3.2: 239 | version "5.3.2" 240 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 241 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 242 | 243 | acorn-walk@^7.1.1: 244 | version "7.2.0" 245 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" 246 | integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== 247 | 248 | acorn-walk@^8.1.1: 249 | version "8.2.0" 250 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 251 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 252 | 253 | acorn@^7.1.1: 254 | version "7.4.1" 255 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 256 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 257 | 258 | acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.0: 259 | version "8.8.0" 260 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" 261 | integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== 262 | 263 | agent-base@6: 264 | version "6.0.2" 265 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 266 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 267 | dependencies: 268 | debug "4" 269 | 270 | ajv@^6.10.0, ajv@^6.12.4: 271 | version "6.12.6" 272 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 273 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 274 | dependencies: 275 | fast-deep-equal "^3.1.1" 276 | fast-json-stable-stringify "^2.0.0" 277 | json-schema-traverse "^0.4.1" 278 | uri-js "^4.2.2" 279 | 280 | ansi-colors@4.1.1: 281 | version "4.1.1" 282 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 283 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 284 | 285 | ansi-regex@^5.0.1: 286 | version "5.0.1" 287 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 288 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 289 | 290 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 291 | version "4.3.0" 292 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 293 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 294 | dependencies: 295 | color-convert "^2.0.1" 296 | 297 | ansi-styles@^5.0.0: 298 | version "5.2.0" 299 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" 300 | integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== 301 | 302 | anymatch@~3.1.2: 303 | version "3.1.2" 304 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 305 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 306 | dependencies: 307 | normalize-path "^3.0.0" 308 | picomatch "^2.0.4" 309 | 310 | arg@^4.1.0: 311 | version "4.1.3" 312 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 313 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 314 | 315 | argparse@^2.0.1: 316 | version "2.0.1" 317 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 318 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 319 | 320 | array-union@^2.1.0: 321 | version "2.1.0" 322 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 323 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 324 | 325 | assertion-error@^1.1.0: 326 | version "1.1.0" 327 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 328 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 329 | 330 | asynckit@^0.4.0: 331 | version "0.4.0" 332 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 333 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 334 | 335 | balanced-match@^1.0.0: 336 | version "1.0.2" 337 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 338 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 339 | 340 | binary-extensions@^2.0.0: 341 | version "2.2.0" 342 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 343 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 344 | 345 | brace-expansion@^1.1.7: 346 | version "1.1.11" 347 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 348 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 349 | dependencies: 350 | balanced-match "^1.0.0" 351 | concat-map "0.0.1" 352 | 353 | brace-expansion@^2.0.1: 354 | version "2.0.1" 355 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 356 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 357 | dependencies: 358 | balanced-match "^1.0.0" 359 | 360 | braces@^3.0.2, braces@~3.0.2: 361 | version "3.0.2" 362 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 363 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 364 | dependencies: 365 | fill-range "^7.0.1" 366 | 367 | browser-process-hrtime@^1.0.0: 368 | version "1.0.0" 369 | resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" 370 | integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== 371 | 372 | browser-stdout@1.3.1: 373 | version "1.3.1" 374 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 375 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 376 | 377 | callsites@^3.0.0: 378 | version "3.1.0" 379 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 380 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 381 | 382 | camelcase@^6.0.0: 383 | version "6.3.0" 384 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 385 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 386 | 387 | chai@^4.2.0: 388 | version "4.3.6" 389 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" 390 | integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== 391 | dependencies: 392 | assertion-error "^1.1.0" 393 | check-error "^1.0.2" 394 | deep-eql "^3.0.1" 395 | get-func-name "^2.0.0" 396 | loupe "^2.3.1" 397 | pathval "^1.1.1" 398 | type-detect "^4.0.5" 399 | 400 | chalk@^4.0.0, chalk@^4.1.0: 401 | version "4.1.2" 402 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 403 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 404 | dependencies: 405 | ansi-styles "^4.1.0" 406 | supports-color "^7.1.0" 407 | 408 | check-error@^1.0.2: 409 | version "1.0.2" 410 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 411 | integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== 412 | 413 | chokidar@3.5.3: 414 | version "3.5.3" 415 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 416 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 417 | dependencies: 418 | anymatch "~3.1.2" 419 | braces "~3.0.2" 420 | glob-parent "~5.1.2" 421 | is-binary-path "~2.1.0" 422 | is-glob "~4.0.1" 423 | normalize-path "~3.0.0" 424 | readdirp "~3.6.0" 425 | optionalDependencies: 426 | fsevents "~2.3.2" 427 | 428 | cliui@^7.0.2: 429 | version "7.0.4" 430 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 431 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 432 | dependencies: 433 | string-width "^4.2.0" 434 | strip-ansi "^6.0.0" 435 | wrap-ansi "^7.0.0" 436 | 437 | color-convert@^2.0.1: 438 | version "2.0.1" 439 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 440 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 441 | dependencies: 442 | color-name "~1.1.4" 443 | 444 | color-name@~1.1.4: 445 | version "1.1.4" 446 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 447 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 448 | 449 | combined-stream@^1.0.8: 450 | version "1.0.8" 451 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 452 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 453 | dependencies: 454 | delayed-stream "~1.0.0" 455 | 456 | concat-map@0.0.1: 457 | version "0.0.1" 458 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 459 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 460 | 461 | create-require@^1.1.0: 462 | version "1.1.1" 463 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 464 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 465 | 466 | cross-env-file@^1.0.0: 467 | version "1.0.0" 468 | resolved "https://registry.yarnpkg.com/cross-env-file/-/cross-env-file-1.0.0.tgz#0cea61eea0e4ab3b7876b06279ff11dee40dc139" 469 | integrity sha512-2KSiiYPfIYnaHoaCufKM/kEZFUJgg4+9LmUILr3Utf5yDuaRIm9k4swJcG8Q1bWCQMWeww8g2KeSn1k9abnAXA== 470 | dependencies: 471 | cross-spawn "^6.0.5" 472 | is-windows "^1.0.0" 473 | 474 | cross-spawn@^6.0.5: 475 | version "6.0.5" 476 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 477 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 478 | dependencies: 479 | nice-try "^1.0.4" 480 | path-key "^2.0.1" 481 | semver "^5.5.0" 482 | shebang-command "^1.2.0" 483 | which "^1.2.9" 484 | 485 | cross-spawn@^7.0.2: 486 | version "7.0.3" 487 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 488 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 489 | dependencies: 490 | path-key "^3.1.0" 491 | shebang-command "^2.0.0" 492 | which "^2.0.1" 493 | 494 | cssom@^0.5.0: 495 | version "0.5.0" 496 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" 497 | integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== 498 | 499 | cssom@~0.3.6: 500 | version "0.3.8" 501 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" 502 | integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== 503 | 504 | cssstyle@^2.3.0: 505 | version "2.3.0" 506 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" 507 | integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== 508 | dependencies: 509 | cssom "~0.3.6" 510 | 511 | data-urls@^3.0.2: 512 | version "3.0.2" 513 | resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" 514 | integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== 515 | dependencies: 516 | abab "^2.0.6" 517 | whatwg-mimetype "^3.0.0" 518 | whatwg-url "^11.0.0" 519 | 520 | debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: 521 | version "4.3.4" 522 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 523 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 524 | dependencies: 525 | ms "2.1.2" 526 | 527 | decamelize@^4.0.0: 528 | version "4.0.0" 529 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 530 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 531 | 532 | decimal.js@^10.3.1: 533 | version "10.3.1" 534 | resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" 535 | integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== 536 | 537 | deep-eql@^3.0.1: 538 | version "3.0.1" 539 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 540 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 541 | dependencies: 542 | type-detect "^4.0.0" 543 | 544 | deep-is@^0.1.3, deep-is@~0.1.3: 545 | version "0.1.4" 546 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 547 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 548 | 549 | delayed-stream@~1.0.0: 550 | version "1.0.0" 551 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 552 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 553 | 554 | diff-sequences@^28.1.1: 555 | version "28.1.1" 556 | resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" 557 | integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== 558 | 559 | diff@5.0.0: 560 | version "5.0.0" 561 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 562 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 563 | 564 | diff@^4.0.1: 565 | version "4.0.2" 566 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 567 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 568 | 569 | dir-glob@^3.0.1: 570 | version "3.0.1" 571 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 572 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 573 | dependencies: 574 | path-type "^4.0.0" 575 | 576 | doctrine@^3.0.0: 577 | version "3.0.0" 578 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 579 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 580 | dependencies: 581 | esutils "^2.0.2" 582 | 583 | domexception@^4.0.0: 584 | version "4.0.0" 585 | resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" 586 | integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== 587 | dependencies: 588 | webidl-conversions "^7.0.0" 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 | entities@^4.3.0: 596 | version "4.3.1" 597 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.1.tgz#c34062a94c865c322f9d67b4384e4169bcede6a4" 598 | integrity sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg== 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, 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 | escodegen@^2.0.0: 611 | version "2.0.0" 612 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" 613 | integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== 614 | dependencies: 615 | esprima "^4.0.1" 616 | estraverse "^5.2.0" 617 | esutils "^2.0.2" 618 | optionator "^0.8.1" 619 | optionalDependencies: 620 | source-map "~0.6.1" 621 | 622 | eslint-scope@^5.1.1: 623 | version "5.1.1" 624 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 625 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 626 | dependencies: 627 | esrecurse "^4.3.0" 628 | estraverse "^4.1.1" 629 | 630 | eslint-scope@^7.1.1: 631 | version "7.1.1" 632 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" 633 | integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== 634 | dependencies: 635 | esrecurse "^4.3.0" 636 | estraverse "^5.2.0" 637 | 638 | eslint-utils@^3.0.0: 639 | version "3.0.0" 640 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 641 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 642 | dependencies: 643 | eslint-visitor-keys "^2.0.0" 644 | 645 | eslint-visitor-keys@^2.0.0: 646 | version "2.1.0" 647 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 648 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 649 | 650 | eslint-visitor-keys@^3.3.0: 651 | version "3.3.0" 652 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 653 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 654 | 655 | eslint@^8.21.0: 656 | version "8.21.0" 657 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.21.0.tgz#1940a68d7e0573cef6f50037addee295ff9be9ef" 658 | integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA== 659 | dependencies: 660 | "@eslint/eslintrc" "^1.3.0" 661 | "@humanwhocodes/config-array" "^0.10.4" 662 | "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" 663 | ajv "^6.10.0" 664 | chalk "^4.0.0" 665 | cross-spawn "^7.0.2" 666 | debug "^4.3.2" 667 | doctrine "^3.0.0" 668 | escape-string-regexp "^4.0.0" 669 | eslint-scope "^7.1.1" 670 | eslint-utils "^3.0.0" 671 | eslint-visitor-keys "^3.3.0" 672 | espree "^9.3.3" 673 | esquery "^1.4.0" 674 | esutils "^2.0.2" 675 | fast-deep-equal "^3.1.3" 676 | file-entry-cache "^6.0.1" 677 | find-up "^5.0.0" 678 | functional-red-black-tree "^1.0.1" 679 | glob-parent "^6.0.1" 680 | globals "^13.15.0" 681 | globby "^11.1.0" 682 | grapheme-splitter "^1.0.4" 683 | ignore "^5.2.0" 684 | import-fresh "^3.0.0" 685 | imurmurhash "^0.1.4" 686 | is-glob "^4.0.0" 687 | js-yaml "^4.1.0" 688 | json-stable-stringify-without-jsonify "^1.0.1" 689 | levn "^0.4.1" 690 | lodash.merge "^4.6.2" 691 | minimatch "^3.1.2" 692 | natural-compare "^1.4.0" 693 | optionator "^0.9.1" 694 | regexpp "^3.2.0" 695 | strip-ansi "^6.0.1" 696 | strip-json-comments "^3.1.0" 697 | text-table "^0.2.0" 698 | v8-compile-cache "^2.0.3" 699 | 700 | espree@^9.3.2, espree@^9.3.3: 701 | version "9.3.3" 702 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" 703 | integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== 704 | dependencies: 705 | acorn "^8.8.0" 706 | acorn-jsx "^5.3.2" 707 | eslint-visitor-keys "^3.3.0" 708 | 709 | esprima@^4.0.1: 710 | version "4.0.1" 711 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 712 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 713 | 714 | esquery@^1.4.0: 715 | version "1.4.0" 716 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 717 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 718 | dependencies: 719 | estraverse "^5.1.0" 720 | 721 | esrecurse@^4.3.0: 722 | version "4.3.0" 723 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 724 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 725 | dependencies: 726 | estraverse "^5.2.0" 727 | 728 | estraverse@^4.1.1: 729 | version "4.3.0" 730 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 731 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 732 | 733 | estraverse@^5.1.0, estraverse@^5.2.0: 734 | version "5.3.0" 735 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 736 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 737 | 738 | esutils@^2.0.2: 739 | version "2.0.3" 740 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 741 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 742 | 743 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 744 | version "3.1.3" 745 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 746 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 747 | 748 | fast-glob@^3.2.9: 749 | version "3.2.11" 750 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" 751 | integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 752 | dependencies: 753 | "@nodelib/fs.stat" "^2.0.2" 754 | "@nodelib/fs.walk" "^1.2.3" 755 | glob-parent "^5.1.2" 756 | merge2 "^1.3.0" 757 | micromatch "^4.0.4" 758 | 759 | fast-json-stable-stringify@^2.0.0: 760 | version "2.1.0" 761 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 762 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 763 | 764 | fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: 765 | version "2.0.6" 766 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 767 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 768 | 769 | fastq@^1.6.0: 770 | version "1.13.0" 771 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 772 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 773 | dependencies: 774 | reusify "^1.0.4" 775 | 776 | file-entry-cache@^6.0.1: 777 | version "6.0.1" 778 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 779 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 780 | dependencies: 781 | flat-cache "^3.0.4" 782 | 783 | fill-range@^7.0.1: 784 | version "7.0.1" 785 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 786 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 787 | dependencies: 788 | to-regex-range "^5.0.1" 789 | 790 | find-up@5.0.0, find-up@^5.0.0: 791 | version "5.0.0" 792 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 793 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 794 | dependencies: 795 | locate-path "^6.0.0" 796 | path-exists "^4.0.0" 797 | 798 | flat-cache@^3.0.4: 799 | version "3.0.4" 800 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 801 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 802 | dependencies: 803 | flatted "^3.1.0" 804 | rimraf "^3.0.2" 805 | 806 | flat@^5.0.2: 807 | version "5.0.2" 808 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 809 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 810 | 811 | flatted@^3.1.0: 812 | version "3.2.6" 813 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" 814 | integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== 815 | 816 | form-data@^4.0.0: 817 | version "4.0.0" 818 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 819 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 820 | dependencies: 821 | asynckit "^0.4.0" 822 | combined-stream "^1.0.8" 823 | mime-types "^2.1.12" 824 | 825 | fs.realpath@^1.0.0: 826 | version "1.0.0" 827 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 828 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 829 | 830 | fsevents@~2.3.2: 831 | version "2.3.2" 832 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 833 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 834 | 835 | functional-red-black-tree@^1.0.1: 836 | version "1.0.1" 837 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 838 | integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== 839 | 840 | get-caller-file@^2.0.5: 841 | version "2.0.5" 842 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 843 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 844 | 845 | get-func-name@^2.0.0: 846 | version "2.0.0" 847 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 848 | integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== 849 | 850 | glob-parent@^5.1.2, glob-parent@~5.1.2: 851 | version "5.1.2" 852 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 853 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 854 | dependencies: 855 | is-glob "^4.0.1" 856 | 857 | glob-parent@^6.0.1: 858 | version "6.0.2" 859 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 860 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 861 | dependencies: 862 | is-glob "^4.0.3" 863 | 864 | glob@7.2.0: 865 | version "7.2.0" 866 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 867 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 868 | dependencies: 869 | fs.realpath "^1.0.0" 870 | inflight "^1.0.4" 871 | inherits "2" 872 | minimatch "^3.0.4" 873 | once "^1.3.0" 874 | path-is-absolute "^1.0.0" 875 | 876 | glob@^7.1.3: 877 | version "7.2.3" 878 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 879 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 880 | dependencies: 881 | fs.realpath "^1.0.0" 882 | inflight "^1.0.4" 883 | inherits "2" 884 | minimatch "^3.1.1" 885 | once "^1.3.0" 886 | path-is-absolute "^1.0.0" 887 | 888 | globals@^13.15.0: 889 | version "13.17.0" 890 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" 891 | integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== 892 | dependencies: 893 | type-fest "^0.20.2" 894 | 895 | globby@^11.1.0: 896 | version "11.1.0" 897 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 898 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 899 | dependencies: 900 | array-union "^2.1.0" 901 | dir-glob "^3.0.1" 902 | fast-glob "^3.2.9" 903 | ignore "^5.2.0" 904 | merge2 "^1.4.1" 905 | slash "^3.0.0" 906 | 907 | grapheme-splitter@^1.0.4: 908 | version "1.0.4" 909 | resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" 910 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== 911 | 912 | has-flag@^4.0.0: 913 | version "4.0.0" 914 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 915 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 916 | 917 | he@1.2.0: 918 | version "1.2.0" 919 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 920 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 921 | 922 | html-encoding-sniffer@^3.0.0: 923 | version "3.0.0" 924 | resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" 925 | integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== 926 | dependencies: 927 | whatwg-encoding "^2.0.0" 928 | 929 | http-proxy-agent@^5.0.0: 930 | version "5.0.0" 931 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" 932 | integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== 933 | dependencies: 934 | "@tootallnate/once" "2" 935 | agent-base "6" 936 | debug "4" 937 | 938 | https-proxy-agent@^5.0.1: 939 | version "5.0.1" 940 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" 941 | integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== 942 | dependencies: 943 | agent-base "6" 944 | debug "4" 945 | 946 | iconv-lite@0.6.3: 947 | version "0.6.3" 948 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 949 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 950 | dependencies: 951 | safer-buffer ">= 2.1.2 < 3.0.0" 952 | 953 | ignore@^5.2.0: 954 | version "5.2.0" 955 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 956 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 957 | 958 | import-fresh@^3.0.0, import-fresh@^3.2.1: 959 | version "3.3.0" 960 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 961 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 962 | dependencies: 963 | parent-module "^1.0.0" 964 | resolve-from "^4.0.0" 965 | 966 | imurmurhash@^0.1.4: 967 | version "0.1.4" 968 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 969 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 970 | 971 | inflight@^1.0.4: 972 | version "1.0.6" 973 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 974 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 975 | dependencies: 976 | once "^1.3.0" 977 | wrappy "1" 978 | 979 | inherits@2: 980 | version "2.0.4" 981 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 982 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 983 | 984 | is-binary-path@~2.1.0: 985 | version "2.1.0" 986 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 987 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 988 | dependencies: 989 | binary-extensions "^2.0.0" 990 | 991 | is-extglob@^2.1.1: 992 | version "2.1.1" 993 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 994 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 995 | 996 | is-fullwidth-code-point@^3.0.0: 997 | version "3.0.0" 998 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 999 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1000 | 1001 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1002 | version "4.0.3" 1003 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1004 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1005 | dependencies: 1006 | is-extglob "^2.1.1" 1007 | 1008 | is-glob@~4.0.1: 1009 | version "4.0.1" 1010 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1011 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1012 | dependencies: 1013 | is-extglob "^2.1.1" 1014 | 1015 | is-number@^7.0.0: 1016 | version "7.0.0" 1017 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1018 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1019 | 1020 | is-plain-obj@^2.1.0: 1021 | version "2.1.0" 1022 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 1023 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 1024 | 1025 | is-potential-custom-element-name@^1.0.1: 1026 | version "1.0.1" 1027 | resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" 1028 | integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== 1029 | 1030 | is-unicode-supported@^0.1.0: 1031 | version "0.1.0" 1032 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 1033 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 1034 | 1035 | is-windows@^1.0.0: 1036 | version "1.0.2" 1037 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1038 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1039 | 1040 | isexe@^2.0.0: 1041 | version "2.0.0" 1042 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1043 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1044 | 1045 | jest-diff@^28.1.3: 1046 | version "28.1.3" 1047 | resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" 1048 | integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== 1049 | dependencies: 1050 | chalk "^4.0.0" 1051 | diff-sequences "^28.1.1" 1052 | jest-get-type "^28.0.2" 1053 | pretty-format "^28.1.3" 1054 | 1055 | jest-get-type@^28.0.2: 1056 | version "28.0.2" 1057 | resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" 1058 | integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== 1059 | 1060 | jest-matcher-utils@^28.0.0: 1061 | version "28.1.3" 1062 | resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" 1063 | integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== 1064 | dependencies: 1065 | chalk "^4.0.0" 1066 | jest-diff "^28.1.3" 1067 | jest-get-type "^28.0.2" 1068 | pretty-format "^28.1.3" 1069 | 1070 | js-yaml@4.1.0, js-yaml@^4.1.0: 1071 | version "4.1.0" 1072 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1073 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1074 | dependencies: 1075 | argparse "^2.0.1" 1076 | 1077 | jsdom-global@^3.0.2: 1078 | version "3.0.2" 1079 | resolved "https://registry.yarnpkg.com/jsdom-global/-/jsdom-global-3.0.2.tgz#6bd299c13b0c4626b2da2c0393cd4385d606acb9" 1080 | integrity sha1-a9KZwTsMRiay2iwDk81DhdYGrLk= 1081 | 1082 | jsdom@^20.0.0: 1083 | version "20.0.0" 1084 | resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.0.tgz#882825ac9cc5e5bbee704ba16143e1fa78361ebf" 1085 | integrity sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA== 1086 | dependencies: 1087 | abab "^2.0.6" 1088 | acorn "^8.7.1" 1089 | acorn-globals "^6.0.0" 1090 | cssom "^0.5.0" 1091 | cssstyle "^2.3.0" 1092 | data-urls "^3.0.2" 1093 | decimal.js "^10.3.1" 1094 | domexception "^4.0.0" 1095 | escodegen "^2.0.0" 1096 | form-data "^4.0.0" 1097 | html-encoding-sniffer "^3.0.0" 1098 | http-proxy-agent "^5.0.0" 1099 | https-proxy-agent "^5.0.1" 1100 | is-potential-custom-element-name "^1.0.1" 1101 | nwsapi "^2.2.0" 1102 | parse5 "^7.0.0" 1103 | saxes "^6.0.0" 1104 | symbol-tree "^3.2.4" 1105 | tough-cookie "^4.0.0" 1106 | w3c-hr-time "^1.0.2" 1107 | w3c-xmlserializer "^3.0.0" 1108 | webidl-conversions "^7.0.0" 1109 | whatwg-encoding "^2.0.0" 1110 | whatwg-mimetype "^3.0.0" 1111 | whatwg-url "^11.0.0" 1112 | ws "^8.8.0" 1113 | xml-name-validator "^4.0.0" 1114 | 1115 | json-schema-traverse@^0.4.1: 1116 | version "0.4.1" 1117 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1118 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1119 | 1120 | json-stable-stringify-without-jsonify@^1.0.1: 1121 | version "1.0.1" 1122 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1123 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1124 | 1125 | levn@^0.4.1: 1126 | version "0.4.1" 1127 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1128 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1129 | dependencies: 1130 | prelude-ls "^1.2.1" 1131 | type-check "~0.4.0" 1132 | 1133 | levn@~0.3.0: 1134 | version "0.3.0" 1135 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1136 | integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== 1137 | dependencies: 1138 | prelude-ls "~1.1.2" 1139 | type-check "~0.3.2" 1140 | 1141 | locate-path@^6.0.0: 1142 | version "6.0.0" 1143 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1144 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1145 | dependencies: 1146 | p-locate "^5.0.0" 1147 | 1148 | lodash.merge@^4.6.2: 1149 | version "4.6.2" 1150 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1151 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1152 | 1153 | lodash@^4.17.21: 1154 | version "4.17.21" 1155 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1156 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1157 | 1158 | log-symbols@4.1.0: 1159 | version "4.1.0" 1160 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 1161 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 1162 | dependencies: 1163 | chalk "^4.1.0" 1164 | is-unicode-supported "^0.1.0" 1165 | 1166 | loupe@^2.3.1: 1167 | version "2.3.4" 1168 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" 1169 | integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== 1170 | dependencies: 1171 | get-func-name "^2.0.0" 1172 | 1173 | lru-cache@^6.0.0: 1174 | version "6.0.0" 1175 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1176 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1177 | dependencies: 1178 | yallist "^4.0.0" 1179 | 1180 | make-error@^1.1.1: 1181 | version "1.3.6" 1182 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1183 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1184 | 1185 | merge2@^1.3.0, merge2@^1.4.1: 1186 | version "1.4.1" 1187 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1188 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1189 | 1190 | micromatch@^4.0.4: 1191 | version "4.0.5" 1192 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1193 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1194 | dependencies: 1195 | braces "^3.0.2" 1196 | picomatch "^2.3.1" 1197 | 1198 | mime-db@1.52.0: 1199 | version "1.52.0" 1200 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1201 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1202 | 1203 | mime-types@^2.1.12: 1204 | version "2.1.35" 1205 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1206 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1207 | dependencies: 1208 | mime-db "1.52.0" 1209 | 1210 | minimatch@5.0.1: 1211 | version "5.0.1" 1212 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" 1213 | integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== 1214 | dependencies: 1215 | brace-expansion "^2.0.1" 1216 | 1217 | minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: 1218 | version "3.1.2" 1219 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1220 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1221 | dependencies: 1222 | brace-expansion "^1.1.7" 1223 | 1224 | mocha@^10.0.0: 1225 | version "10.0.0" 1226 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" 1227 | integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== 1228 | dependencies: 1229 | "@ungap/promise-all-settled" "1.1.2" 1230 | ansi-colors "4.1.1" 1231 | browser-stdout "1.3.1" 1232 | chokidar "3.5.3" 1233 | debug "4.3.4" 1234 | diff "5.0.0" 1235 | escape-string-regexp "4.0.0" 1236 | find-up "5.0.0" 1237 | glob "7.2.0" 1238 | he "1.2.0" 1239 | js-yaml "4.1.0" 1240 | log-symbols "4.1.0" 1241 | minimatch "5.0.1" 1242 | ms "2.1.3" 1243 | nanoid "3.3.3" 1244 | serialize-javascript "6.0.0" 1245 | strip-json-comments "3.1.1" 1246 | supports-color "8.1.1" 1247 | workerpool "6.2.1" 1248 | yargs "16.2.0" 1249 | yargs-parser "20.2.4" 1250 | yargs-unparser "2.0.0" 1251 | 1252 | ms@2.1.2: 1253 | version "2.1.2" 1254 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1255 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1256 | 1257 | ms@2.1.3: 1258 | version "2.1.3" 1259 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1260 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1261 | 1262 | nanoid@3.3.3: 1263 | version "3.3.3" 1264 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" 1265 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 1266 | 1267 | natural-compare@^1.4.0: 1268 | version "1.4.0" 1269 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1270 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1271 | 1272 | nice-try@^1.0.4: 1273 | version "1.0.5" 1274 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1275 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1276 | 1277 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1278 | version "3.0.0" 1279 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1280 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1281 | 1282 | nwsapi@^2.2.0: 1283 | version "2.2.1" 1284 | resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" 1285 | integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== 1286 | 1287 | once@^1.3.0: 1288 | version "1.4.0" 1289 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1290 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1291 | dependencies: 1292 | wrappy "1" 1293 | 1294 | optionator@^0.8.1: 1295 | version "0.8.3" 1296 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 1297 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 1298 | dependencies: 1299 | deep-is "~0.1.3" 1300 | fast-levenshtein "~2.0.6" 1301 | levn "~0.3.0" 1302 | prelude-ls "~1.1.2" 1303 | type-check "~0.3.2" 1304 | word-wrap "~1.2.3" 1305 | 1306 | optionator@^0.9.1: 1307 | version "0.9.1" 1308 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1309 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1310 | dependencies: 1311 | deep-is "^0.1.3" 1312 | fast-levenshtein "^2.0.6" 1313 | levn "^0.4.1" 1314 | prelude-ls "^1.2.1" 1315 | type-check "^0.4.0" 1316 | word-wrap "^1.2.3" 1317 | 1318 | p-limit@^3.0.2: 1319 | version "3.1.0" 1320 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1321 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1322 | dependencies: 1323 | yocto-queue "^0.1.0" 1324 | 1325 | p-locate@^5.0.0: 1326 | version "5.0.0" 1327 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1328 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1329 | dependencies: 1330 | p-limit "^3.0.2" 1331 | 1332 | parent-module@^1.0.0: 1333 | version "1.0.1" 1334 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1335 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1336 | dependencies: 1337 | callsites "^3.0.0" 1338 | 1339 | parse5@^7.0.0: 1340 | version "7.0.0" 1341 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.0.0.tgz#51f74a5257f5fcc536389e8c2d0b3802e1bfa91a" 1342 | integrity sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g== 1343 | dependencies: 1344 | entities "^4.3.0" 1345 | 1346 | path-exists@^4.0.0: 1347 | version "4.0.0" 1348 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1349 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1350 | 1351 | path-is-absolute@^1.0.0: 1352 | version "1.0.1" 1353 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1354 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1355 | 1356 | path-key@^2.0.1: 1357 | version "2.0.1" 1358 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1359 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1360 | 1361 | path-key@^3.1.0: 1362 | version "3.1.1" 1363 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1364 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1365 | 1366 | path-type@^4.0.0: 1367 | version "4.0.0" 1368 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1369 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1370 | 1371 | pathval@^1.1.1: 1372 | version "1.1.1" 1373 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 1374 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1375 | 1376 | picomatch@^2.0.4: 1377 | version "2.2.2" 1378 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1379 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1380 | 1381 | picomatch@^2.2.1, picomatch@^2.3.1: 1382 | version "2.3.1" 1383 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1384 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1385 | 1386 | prelude-ls@^1.2.1: 1387 | version "1.2.1" 1388 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1389 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1390 | 1391 | prelude-ls@~1.1.2: 1392 | version "1.1.2" 1393 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1394 | integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== 1395 | 1396 | pretty-format@^28.0.0, pretty-format@^28.1.3: 1397 | version "28.1.3" 1398 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" 1399 | integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== 1400 | dependencies: 1401 | "@jest/schemas" "^28.1.3" 1402 | ansi-regex "^5.0.1" 1403 | ansi-styles "^5.0.0" 1404 | react-is "^18.0.0" 1405 | 1406 | psl@^1.1.33: 1407 | version "1.9.0" 1408 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" 1409 | integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== 1410 | 1411 | punycode@^2.1.0, punycode@^2.1.1: 1412 | version "2.1.1" 1413 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1414 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1415 | 1416 | queue-microtask@^1.2.2: 1417 | version "1.2.3" 1418 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1419 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1420 | 1421 | randombytes@^2.1.0: 1422 | version "2.1.0" 1423 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1424 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1425 | dependencies: 1426 | safe-buffer "^5.1.0" 1427 | 1428 | react-is@^18.0.0: 1429 | version "18.2.0" 1430 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" 1431 | integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== 1432 | 1433 | readdirp@~3.6.0: 1434 | version "3.6.0" 1435 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1436 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1437 | dependencies: 1438 | picomatch "^2.2.1" 1439 | 1440 | regexpp@^3.2.0: 1441 | version "3.2.0" 1442 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 1443 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 1444 | 1445 | require-directory@^2.1.1: 1446 | version "2.1.1" 1447 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1448 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1449 | 1450 | resolve-from@^4.0.0: 1451 | version "4.0.0" 1452 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1453 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1454 | 1455 | reusify@^1.0.4: 1456 | version "1.0.4" 1457 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1458 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1459 | 1460 | rimraf@^3.0.2: 1461 | version "3.0.2" 1462 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1463 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1464 | dependencies: 1465 | glob "^7.1.3" 1466 | 1467 | run-parallel@^1.1.9: 1468 | version "1.2.0" 1469 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1470 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1471 | dependencies: 1472 | queue-microtask "^1.2.2" 1473 | 1474 | safe-buffer@^5.1.0: 1475 | version "5.2.1" 1476 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1477 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1478 | 1479 | "safer-buffer@>= 2.1.2 < 3.0.0": 1480 | version "2.1.2" 1481 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1482 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1483 | 1484 | saxes@^6.0.0: 1485 | version "6.0.0" 1486 | resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" 1487 | integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== 1488 | dependencies: 1489 | xmlchars "^2.2.0" 1490 | 1491 | semver@^5.5.0: 1492 | version "5.7.1" 1493 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1494 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1495 | 1496 | semver@^7.3.7: 1497 | version "7.3.7" 1498 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" 1499 | integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== 1500 | dependencies: 1501 | lru-cache "^6.0.0" 1502 | 1503 | serialize-javascript@6.0.0: 1504 | version "6.0.0" 1505 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1506 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1507 | dependencies: 1508 | randombytes "^2.1.0" 1509 | 1510 | shebang-command@^1.2.0: 1511 | version "1.2.0" 1512 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1513 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1514 | dependencies: 1515 | shebang-regex "^1.0.0" 1516 | 1517 | shebang-command@^2.0.0: 1518 | version "2.0.0" 1519 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1520 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1521 | dependencies: 1522 | shebang-regex "^3.0.0" 1523 | 1524 | shebang-regex@^1.0.0: 1525 | version "1.0.0" 1526 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1527 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1528 | 1529 | shebang-regex@^3.0.0: 1530 | version "3.0.0" 1531 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1532 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1533 | 1534 | slash@^3.0.0: 1535 | version "3.0.0" 1536 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1537 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1538 | 1539 | source-map@~0.6.1: 1540 | version "0.6.1" 1541 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1542 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1543 | 1544 | string-width@^4.1.0, string-width@^4.2.0: 1545 | version "4.2.3" 1546 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1547 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1548 | dependencies: 1549 | emoji-regex "^8.0.0" 1550 | is-fullwidth-code-point "^3.0.0" 1551 | strip-ansi "^6.0.1" 1552 | 1553 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1554 | version "6.0.1" 1555 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1556 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1557 | dependencies: 1558 | ansi-regex "^5.0.1" 1559 | 1560 | strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 1561 | version "3.1.1" 1562 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1563 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1564 | 1565 | supports-color@8.1.1: 1566 | version "8.1.1" 1567 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1568 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1569 | dependencies: 1570 | has-flag "^4.0.0" 1571 | 1572 | supports-color@^7.1.0: 1573 | version "7.2.0" 1574 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1575 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1576 | dependencies: 1577 | has-flag "^4.0.0" 1578 | 1579 | symbol-tree@^3.2.4: 1580 | version "3.2.4" 1581 | resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" 1582 | integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== 1583 | 1584 | text-table@^0.2.0: 1585 | version "0.2.0" 1586 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1587 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1588 | 1589 | to-regex-range@^5.0.1: 1590 | version "5.0.1" 1591 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1592 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1593 | dependencies: 1594 | is-number "^7.0.0" 1595 | 1596 | tough-cookie@^4.0.0: 1597 | version "4.0.0" 1598 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" 1599 | integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== 1600 | dependencies: 1601 | psl "^1.1.33" 1602 | punycode "^2.1.1" 1603 | universalify "^0.1.2" 1604 | 1605 | tr46@^3.0.0: 1606 | version "3.0.0" 1607 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" 1608 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== 1609 | dependencies: 1610 | punycode "^2.1.1" 1611 | 1612 | ts-node@^10.9.1: 1613 | version "10.9.1" 1614 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 1615 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 1616 | dependencies: 1617 | "@cspotcode/source-map-support" "^0.8.0" 1618 | "@tsconfig/node10" "^1.0.7" 1619 | "@tsconfig/node12" "^1.0.7" 1620 | "@tsconfig/node14" "^1.0.0" 1621 | "@tsconfig/node16" "^1.0.2" 1622 | acorn "^8.4.1" 1623 | acorn-walk "^8.1.1" 1624 | arg "^4.1.0" 1625 | create-require "^1.1.0" 1626 | diff "^4.0.1" 1627 | make-error "^1.1.1" 1628 | v8-compile-cache-lib "^3.0.1" 1629 | yn "3.1.1" 1630 | 1631 | tslib@^1.8.1: 1632 | version "1.14.1" 1633 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1634 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1635 | 1636 | tsutils@^3.21.0: 1637 | version "3.21.0" 1638 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 1639 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 1640 | dependencies: 1641 | tslib "^1.8.1" 1642 | 1643 | type-check@^0.4.0, type-check@~0.4.0: 1644 | version "0.4.0" 1645 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1646 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1647 | dependencies: 1648 | prelude-ls "^1.2.1" 1649 | 1650 | type-check@~0.3.2: 1651 | version "0.3.2" 1652 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1653 | integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== 1654 | dependencies: 1655 | prelude-ls "~1.1.2" 1656 | 1657 | type-detect@^4.0.0, type-detect@^4.0.5: 1658 | version "4.0.8" 1659 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1660 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1661 | 1662 | type-fest@^0.20.2: 1663 | version "0.20.2" 1664 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1665 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1666 | 1667 | typescript@^4.7.4: 1668 | version "4.7.4" 1669 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" 1670 | integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== 1671 | 1672 | universalify@^0.1.2: 1673 | version "0.1.2" 1674 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1675 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 1676 | 1677 | uri-js@^4.2.2: 1678 | version "4.4.1" 1679 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1680 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1681 | dependencies: 1682 | punycode "^2.1.0" 1683 | 1684 | v8-compile-cache-lib@^3.0.1: 1685 | version "3.0.1" 1686 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 1687 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 1688 | 1689 | v8-compile-cache@^2.0.3: 1690 | version "2.3.0" 1691 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" 1692 | integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 1693 | 1694 | w3c-hr-time@^1.0.2: 1695 | version "1.0.2" 1696 | resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" 1697 | integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== 1698 | dependencies: 1699 | browser-process-hrtime "^1.0.0" 1700 | 1701 | w3c-xmlserializer@^3.0.0: 1702 | version "3.0.0" 1703 | resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" 1704 | integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== 1705 | dependencies: 1706 | xml-name-validator "^4.0.0" 1707 | 1708 | webidl-conversions@^7.0.0: 1709 | version "7.0.0" 1710 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" 1711 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== 1712 | 1713 | whatwg-encoding@^2.0.0: 1714 | version "2.0.0" 1715 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" 1716 | integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== 1717 | dependencies: 1718 | iconv-lite "0.6.3" 1719 | 1720 | whatwg-mimetype@^3.0.0: 1721 | version "3.0.0" 1722 | resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" 1723 | integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== 1724 | 1725 | whatwg-url@^11.0.0: 1726 | version "11.0.0" 1727 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" 1728 | integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== 1729 | dependencies: 1730 | tr46 "^3.0.0" 1731 | webidl-conversions "^7.0.0" 1732 | 1733 | which@^1.2.9: 1734 | version "1.3.1" 1735 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1736 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1737 | dependencies: 1738 | isexe "^2.0.0" 1739 | 1740 | which@^2.0.1: 1741 | version "2.0.2" 1742 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1743 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1744 | dependencies: 1745 | isexe "^2.0.0" 1746 | 1747 | word-wrap@^1.2.3, word-wrap@~1.2.3: 1748 | version "1.2.3" 1749 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1750 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1751 | 1752 | workerpool@6.2.1: 1753 | version "6.2.1" 1754 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" 1755 | integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== 1756 | 1757 | wrap-ansi@^7.0.0: 1758 | version "7.0.0" 1759 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1760 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1761 | dependencies: 1762 | ansi-styles "^4.0.0" 1763 | string-width "^4.1.0" 1764 | strip-ansi "^6.0.0" 1765 | 1766 | wrappy@1: 1767 | version "1.0.2" 1768 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1769 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1770 | 1771 | ws@^8.8.0: 1772 | version "8.8.1" 1773 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" 1774 | integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== 1775 | 1776 | xml-name-validator@^4.0.0: 1777 | version "4.0.0" 1778 | resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" 1779 | integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== 1780 | 1781 | xmlchars@^2.2.0: 1782 | version "2.2.0" 1783 | resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" 1784 | integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== 1785 | 1786 | y18n@^5.0.5: 1787 | version "5.0.8" 1788 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1789 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1790 | 1791 | yallist@^4.0.0: 1792 | version "4.0.0" 1793 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1794 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1795 | 1796 | yargs-parser@20.2.4: 1797 | version "20.2.4" 1798 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1799 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1800 | 1801 | yargs-parser@^20.2.2: 1802 | version "20.2.9" 1803 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1804 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1805 | 1806 | yargs-unparser@2.0.0: 1807 | version "2.0.0" 1808 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1809 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1810 | dependencies: 1811 | camelcase "^6.0.0" 1812 | decamelize "^4.0.0" 1813 | flat "^5.0.2" 1814 | is-plain-obj "^2.1.0" 1815 | 1816 | yargs@16.2.0: 1817 | version "16.2.0" 1818 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1819 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1820 | dependencies: 1821 | cliui "^7.0.2" 1822 | escalade "^3.1.1" 1823 | get-caller-file "^2.0.5" 1824 | require-directory "^2.1.1" 1825 | string-width "^4.2.0" 1826 | y18n "^5.0.5" 1827 | yargs-parser "^20.2.2" 1828 | 1829 | yn@3.1.1: 1830 | version "3.1.1" 1831 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1832 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1833 | 1834 | yocto-queue@^0.1.0: 1835 | version "0.1.0" 1836 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1837 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1838 | --------------------------------------------------------------------------------