├── .editorconfig ├── .eslintrc.json ├── .gitignore ├── .travis.yml ├── README.md ├── UNLICENSE ├── logo.png ├── logo.svg ├── package.json ├── src ├── Component.ts ├── Entity.ts ├── EntityManager.ts ├── PriorityQueue.ts ├── Query.ts ├── System.ts ├── World.ts ├── events.ts ├── gameClock.ts ├── index.ts └── start.ts ├── test ├── Entity.test.ts ├── EntityManager.test.ts ├── PriorityQueue.test.ts ├── Query.test.ts ├── System.test.ts ├── World.test.ts └── index.test.ts ├── tsconfig.build.json ├── tsconfig.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_size = 2 8 | indent_style = space 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es6": true 4 | }, 5 | "extends": "plugin:@typescript-eslint/recommended", 6 | "parser": "@typescript-eslint/parser", 7 | "parserOptions": { 8 | "project": "./tsconfig.json", 9 | "sourceType": "module" 10 | }, 11 | "rules": { 12 | "@typescript-eslint/explicit-function-return-type": "off", 13 | "@typescript-eslint/explicit-member-accessibility": [ 14 | "error", 15 | { 16 | "accessibility": "no-public", 17 | "overrides": { 18 | "parameterProperties": "off" 19 | } 20 | } 21 | ], 22 | "@typescript-eslint/explicit-module-boundary-types": "off", 23 | "@typescript-eslint/indent": [ 24 | "error", 25 | 2, 26 | { 27 | "ArrayExpression": 1, 28 | "CallExpression": { 29 | "arguments": 1 30 | }, 31 | "FunctionDeclaration": { 32 | "body": 1, 33 | "parameters": 1 34 | }, 35 | "FunctionExpression": { 36 | "body": 1, 37 | "parameters": 1 38 | }, 39 | "ImportDeclaration": 1, 40 | "MemberExpression": 1, 41 | "ObjectExpression": 1, 42 | "SwitchCase": 1, 43 | "VariableDeclarator": 1, 44 | "flatTernaryExpressions": false, 45 | "ignoreComments": false, 46 | "outerIIFEBody": 1 47 | } 48 | ], 49 | "@typescript-eslint/member-delimiter-style": [ 50 | "error", 51 | { 52 | "multiline": { 53 | "delimiter": "comma", 54 | "requireLast": false 55 | }, 56 | "singleline": { 57 | "delimiter": "comma", 58 | "requireLast": false 59 | } 60 | } 61 | ], 62 | "@typescript-eslint/no-explicit-any": "off", 63 | "@typescript-eslint/no-parameter-properties": "off", 64 | "@typescript-eslint/no-unused-vars": [ 65 | "error", 66 | { 67 | "args": "none", 68 | "ignoreRestSiblings": true, 69 | "vars": "all" 70 | } 71 | ], 72 | "@typescript-eslint/no-use-before-define": "off", 73 | "@typescript-eslint/no-useless-constructor": "error", 74 | "accessor-pairs": "error", 75 | "array-bracket-spacing": [ 76 | "error", 77 | "never" 78 | ], 79 | "arrow-spacing": [ 80 | "error", 81 | { 82 | "after": true, 83 | "before": true 84 | } 85 | ], 86 | "block-spacing": [ 87 | "error", 88 | "always" 89 | ], 90 | "brace-style": [ 91 | "error", 92 | "1tbs", 93 | { 94 | "allowSingleLine": true 95 | } 96 | ], 97 | "camelcase": [ 98 | "error", 99 | { 100 | "properties": "never" 101 | } 102 | ], 103 | "comma-dangle": [ 104 | "error", 105 | { 106 | "arrays": "never", 107 | "exports": "never", 108 | "functions": "never", 109 | "imports": "never", 110 | "objects": "never" 111 | } 112 | ], 113 | "comma-spacing": [ 114 | "error", 115 | { 116 | "after": true, 117 | "before": false 118 | } 119 | ], 120 | "comma-style": [ 121 | "error", 122 | "last" 123 | ], 124 | "computed-property-spacing": [ 125 | "error", 126 | "never" 127 | ], 128 | "constructor-super": "error", 129 | "curly": [ 130 | "error", 131 | "multi-line" 132 | ], 133 | "dot-location": [ 134 | "error", 135 | "property" 136 | ], 137 | "eol-last": "error", 138 | "eqeqeq": [ 139 | "error", 140 | "always", 141 | { 142 | "null": "ignore" 143 | } 144 | ], 145 | "func-call-spacing": [ 146 | "error", 147 | "never" 148 | ], 149 | "generator-star-spacing": [ 150 | "error", 151 | { 152 | "after": true, 153 | "before": true 154 | } 155 | ], 156 | "handle-callback-err": [ 157 | "error", 158 | "^(err|error)$" 159 | ], 160 | "indent": "off", 161 | "key-spacing": [ 162 | "error", 163 | { 164 | "afterColon": true, 165 | "beforeColon": false 166 | } 167 | ], 168 | "keyword-spacing": [ 169 | "error", 170 | { 171 | "after": true, 172 | "before": true 173 | } 174 | ], 175 | "linebreak-style": [ 176 | "error", 177 | "unix" 178 | ], 179 | "lines-between-class-members": [ 180 | "error", 181 | "always", 182 | { 183 | "exceptAfterSingleLine": true 184 | } 185 | ], 186 | "max-len": [ 187 | "error", 188 | { 189 | "code": 120 190 | } 191 | ], 192 | "max-lines": [ 193 | "warn", 194 | 200 195 | ], 196 | "new-cap": [ 197 | "error", 198 | { 199 | "capIsNew": false, 200 | "newIsCap": true 201 | } 202 | ], 203 | "new-parens": "error", 204 | "no-array-constructor": "error", 205 | "no-async-promise-executor": "error", 206 | "no-caller": "error", 207 | "no-class-assign": "error", 208 | "no-compare-neg-zero": "error", 209 | "no-cond-assign": "error", 210 | "no-const-assign": "error", 211 | "no-constant-condition": [ 212 | "error", 213 | { 214 | "checkLoops": false 215 | } 216 | ], 217 | "no-control-regex": "error", 218 | "no-debugger": "error", 219 | "no-delete-var": "error", 220 | "no-dupe-args": "error", 221 | "no-dupe-class-members": "error", 222 | "no-dupe-keys": "error", 223 | "no-duplicate-case": "error", 224 | "no-empty-character-class": "error", 225 | "no-empty-pattern": "error", 226 | "no-eval": "error", 227 | "no-ex-assign": "error", 228 | "no-extend-native": "error", 229 | "no-extra-bind": "error", 230 | "no-extra-boolean-cast": "error", 231 | "no-extra-parens": [ 232 | "error", 233 | "functions" 234 | ], 235 | "no-fallthrough": "error", 236 | "no-floating-decimal": "error", 237 | "no-func-assign": "error", 238 | "no-global-assign": "error", 239 | "no-implied-eval": "error", 240 | "no-inner-declarations": [ 241 | "error", 242 | "functions" 243 | ], 244 | "no-invalid-regexp": "error", 245 | "no-irregular-whitespace": "error", 246 | "no-iterator": "error", 247 | "no-label-var": "error", 248 | "no-labels": [ 249 | "error", 250 | { 251 | "allowLoop": false, 252 | "allowSwitch": false 253 | } 254 | ], 255 | "no-lone-blocks": "error", 256 | "no-misleading-character-class": "error", 257 | "no-mixed-operators": [ 258 | "error", 259 | { 260 | "allowSamePrecedence": true, 261 | "groups": [ 262 | [ 263 | "==", 264 | "!=", 265 | "===", 266 | "!==", 267 | ">", 268 | ">=", 269 | "<", 270 | "<=" 271 | ], 272 | [ 273 | "&&", 274 | "||" 275 | ], 276 | [ 277 | "in", 278 | "instanceof" 279 | ] 280 | ] 281 | } 282 | ], 283 | "no-mixed-spaces-and-tabs": "error", 284 | "no-multi-spaces": "error", 285 | "no-multi-str": "error", 286 | "no-multiple-empty-lines": [ 287 | "error", 288 | { 289 | "max": 1, 290 | "maxEOF": 0 291 | } 292 | ], 293 | "no-negated-in-lhs": "error", 294 | "no-new": "error", 295 | "no-new-func": "error", 296 | "no-new-object": "error", 297 | "no-new-require": "error", 298 | "no-new-symbol": "error", 299 | "no-new-wrappers": "error", 300 | "no-obj-calls": "error", 301 | "no-octal": "error", 302 | "no-octal-escape": "error", 303 | "no-path-concat": "error", 304 | "no-proto": "error", 305 | "no-prototype-builtins": "error", 306 | "no-redeclare": [ 307 | "error", 308 | { 309 | "builtinGlobals": false 310 | } 311 | ], 312 | "no-regex-spaces": "error", 313 | "no-return-assign": [ 314 | "error", 315 | "except-parens" 316 | ], 317 | "no-return-await": "error", 318 | "no-self-assign": "error", 319 | "no-self-compare": "error", 320 | "no-sequences": "error", 321 | "no-shadow-restricted-names": "error", 322 | "no-sparse-arrays": "error", 323 | "no-tabs": "error", 324 | "no-template-curly-in-string": "error", 325 | "no-this-before-super": "error", 326 | "no-throw-literal": "error", 327 | "no-trailing-spaces": "error", 328 | "no-unexpected-multiline": "error", 329 | "no-unmodified-loop-condition": "error", 330 | "no-unneeded-ternary": [ 331 | "error", 332 | { 333 | "defaultAssignment": false 334 | } 335 | ], 336 | "no-unreachable": "error", 337 | "no-unsafe-finally": "error", 338 | "no-unsafe-negation": "error", 339 | "no-unused-expressions": [ 340 | "error", 341 | { 342 | "allowShortCircuit": true, 343 | "allowTaggedTemplates": true, 344 | "allowTernary": true 345 | } 346 | ], 347 | "no-use-before-define": [ 348 | "error", 349 | { 350 | "classes": false, 351 | "functions": false, 352 | "variables": false 353 | } 354 | ], 355 | "no-useless-call": "error", 356 | "no-useless-catch": "error", 357 | "no-useless-computed-key": "error", 358 | "no-useless-escape": "error", 359 | "no-useless-rename": "error", 360 | "no-useless-return": "error", 361 | "no-whitespace-before-property": "error", 362 | "no-with": "error", 363 | "object-curly-spacing": [ 364 | "error", 365 | "always" 366 | ], 367 | "object-property-newline": [ 368 | "error", 369 | { 370 | "allowMultiplePropertiesPerLine": true 371 | } 372 | ], 373 | "one-var": [ 374 | "error", 375 | { 376 | "initialized": "never" 377 | } 378 | ], 379 | "operator-linebreak": [ 380 | "error", 381 | "after", 382 | { 383 | "overrides": { 384 | ":": "before", 385 | "?": "before" 386 | } 387 | } 388 | ], 389 | "padded-blocks": [ 390 | "error", 391 | { 392 | "blocks": "never", 393 | "classes": "never", 394 | "switches": "never" 395 | } 396 | ], 397 | "prefer-const": [ 398 | "error", 399 | { 400 | "destructuring": "all" 401 | } 402 | ], 403 | "prefer-promise-reject-errors": "error", 404 | "quote-props": [ 405 | "error", 406 | "as-needed" 407 | ], 408 | "quotes": [ 409 | "error", 410 | "single" 411 | ], 412 | "rest-spread-spacing": [ 413 | "error", 414 | "never" 415 | ], 416 | "semi": [ 417 | "error", 418 | "never" 419 | ], 420 | "semi-spacing": [ 421 | "error", 422 | { 423 | "after": true, 424 | "before": false 425 | } 426 | ], 427 | "space-before-blocks": [ 428 | "error", 429 | "always" 430 | ], 431 | "space-before-function-paren": [ 432 | "error", 433 | "always" 434 | ], 435 | "space-in-parens": [ 436 | "error", 437 | "never" 438 | ], 439 | "space-infix-ops": "error", 440 | "space-unary-ops": [ 441 | "error", 442 | { 443 | "nonwords": false, 444 | "words": true 445 | } 446 | ], 447 | "spaced-comment": [ 448 | "error", 449 | "always", 450 | { 451 | "block": { 452 | "balanced": true, 453 | "exceptions": [ 454 | "*" 455 | ], 456 | "markers": [ 457 | "*package", 458 | "!", 459 | ",", 460 | ":", 461 | "::", 462 | "flow-include" 463 | ] 464 | }, 465 | "line": { 466 | "markers": [ 467 | "*package", 468 | "!", 469 | "/", 470 | ",", 471 | "=" 472 | ] 473 | } 474 | } 475 | ], 476 | "symbol-description": "error", 477 | "template-curly-spacing": [ 478 | "error", 479 | "never" 480 | ], 481 | "template-tag-spacing": [ 482 | "error", 483 | "never" 484 | ], 485 | "unicode-bom": [ 486 | "error", 487 | "never" 488 | ], 489 | "use-isnan": "error", 490 | "valid-typeof": [ 491 | "error", 492 | { 493 | "requireStringLiterals": true 494 | } 495 | ], 496 | "wrap-iife": [ 497 | "error", 498 | "any", 499 | { 500 | "functionPrototypeMethods": true 501 | } 502 | ], 503 | "yield-star-spacing": [ 504 | "error", 505 | "both" 506 | ], 507 | "yoda": [ 508 | "error", 509 | "never" 510 | ] 511 | } 512 | } 513 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | coverage/ 3 | dist/ 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "node" 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | logo 3 |

4 | 5 | # Rook 6 | 7 | [![npm](https://img.shields.io/npm/v/rook-ecs.svg)](https://www.npmjs.com/package/rook-ecs) 8 | [![Build Status](https://travis-ci.org/sz-piotr/rook-ecs.svg?branch=master)](https://travis-ci.org/sz-piotr/rook-ecs) 9 | ![npm bundle size (minified)](https://img.shields.io/bundlephobia/min/rook-ecs.svg) 10 | 11 | Rook is a JavaScript library for creating games in the Entity-Component-System pattern. 12 | Rook is currently a work in progress. All contributions are welcome. 13 | 14 | ## Getting started 15 | 16 | ### Install 17 | 18 | ``` 19 | $ npm install --save rook-ecs 20 | ``` 21 | 22 | or 23 | 24 | ``` 25 | $ yarn add rook-ecs 26 | ``` 27 | 28 | After installing you can include the library in the source 29 | 30 | ```typescript 31 | import { Game } from 'rook-ecs' 32 | 33 | console.log('Hurray!') 34 | ``` 35 | 36 | ### Using UMD build in the browser 37 | 38 | Alternatively, you might want to use an UMD build in the browser. 39 | To do so, grab the minified JavaScript file from 40 | [here](https://unpkg.com/rook-ecs/lib/rook-ecs.min.js) 41 | and add it to your site with a script tag. 42 | 43 | In the browser all of the exports are available under the `Rook` global object. 44 | 45 | ```html 46 | 47 | 50 | ``` 51 | 52 | ## Usage Example 53 | 54 | First we declare the components. Components are just ids that correspond to some 55 | data. In JavaScript you don't need to declare anything, just use pure strings. 56 | 57 | In TypeScript there is a special `component` function that creates type safe 58 | component ids. 59 | 60 | ```typescript 61 | import { component } from 'rook-ecs' 62 | 63 | export interface Position { 64 | x: number, 65 | y: number, 66 | } 67 | export const Position = component('Position') 68 | 69 | export interface Velocity { 70 | x: number, 71 | y: number, 72 | } 73 | export const Velocity = component('Velocity') 74 | ``` 75 | 76 | Having declared our components we can now use them in a system. 77 | 78 | ```typescript 79 | import { system, UpdateTick } from 'rook-ecs' 80 | import { Position, Velocity } from './components' 81 | 82 | export const move = system(UpdateTick, function (world, event) { 83 | for (const entity of world.query(Position, Velocity)) { 84 | const position = entity.get(Position) 85 | const velocity = entity.get(Velocity) 86 | position.x += velocity.x * event.deltaTime 87 | position.y += velocity.y * event.deltaTime 88 | } 89 | }) 90 | ``` 91 | 92 | And just like this, all our entities that have both the `Position` and `Velocity` 93 | components can now be updated with this system. 94 | 95 | The only thing that's left is to start the game and create some entities. 96 | 97 | ```typescript 98 | import { start, gameClock } from 'rook-ecs' 99 | import { Position, Velocity } from './components' 100 | import { move } from './move' 101 | 102 | function init (world) { 103 | world.create() 104 | .set(Position, { x: 0, y: 0 }) 105 | .set(Velocity, { x: 10, y: 20 }) 106 | } 107 | 108 | start([ 109 | gameClock(), 110 | init, 111 | move, 112 | ]) 113 | ``` 114 | 115 | ## Typescript support 116 | 117 | Rook has first class TypeScript support since it is itself written with TypeScript. 118 | No special compiler options have to be specified for Rook to work, although we 119 | recommend using the `strict: true` setting. 120 | 121 | ## Contributing 122 | 123 | Rook is currently a work in progress. All contributions are welcome. 124 | 125 | ## Useful reading 126 | 127 | * [TypeScript Documentation](https://www.typescriptlang.org/docs/home.html) 128 | * [T-Machine ECS Series](http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/) 129 | -------------------------------------------------------------------------------- /UNLICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sz-piotr/rook-ecs/6d745e5dea58a5f1b4e7dc2e25ad95f32f14d318/logo.png -------------------------------------------------------------------------------- /logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 15 | 17 | 18 | 20 | image/svg+xml 21 | 23 | 24 | 25 | 26 | 27 | 31 | 35 | 39 | 43 | 47 | 51 | 55 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rook-ecs", 3 | "description": "An Entity-Component-System library built for ease of use and code readability", 4 | "author": "Piotr Szlachciak ", 5 | "keywords": [ 6 | "ecs", 7 | "entity", 8 | "component", 9 | "system", 10 | "javascript", 11 | "typescript", 12 | "library" 13 | ], 14 | "license": "MIT", 15 | "version": "0.14.0", 16 | "main": "dist/cjs/index.js", 17 | "module": "dist/esm/index.js", 18 | "types": "dist/esm/index.d.ts", 19 | "sideEffects": false, 20 | "repository": { 21 | "type": "git", 22 | "url": "https://github.com/sz-piotr/rook-ecs.git" 23 | }, 24 | "files": [ 25 | "dist", 26 | "src" 27 | ], 28 | "scripts": { 29 | "prepublishOnly": "npm run build", 30 | "build": "rm -rf dist && yarn build:esm && yarn build:cjs", 31 | "build:esm": "tsc -p tsconfig.build.json --outDir dist/esm --module ES6", 32 | "build:cjs": "tsc -p tsconfig.build.json --outDir dist/cjs --declaration false", 33 | "lint": "eslint src --ext .ts,.tsx", 34 | "test": "mocha", 35 | "typecheck": "tsc --noEmit" 36 | }, 37 | "devDependencies": { 38 | "@types/chai": "^4.2.12", 39 | "@types/mocha": "^8.0.2", 40 | "@typescript-eslint/eslint-plugin": "^3.9.0", 41 | "@typescript-eslint/parser": "^3.9.0", 42 | "chai": "^4.2.0", 43 | "eslint": "^7.6.0", 44 | "mocha": "^8.1.1", 45 | "ts-node": "^8.10.2", 46 | "typescript": "^3.9.7" 47 | }, 48 | "mocha": { 49 | "watch-extensions": "ts", 50 | "extension": "ts", 51 | "recursive": true, 52 | "require": "ts-node/register/transpile-only" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Component.ts: -------------------------------------------------------------------------------- 1 | export type Component = string & { __type__: T } 2 | export function component (name: string): Component { 3 | return name as Component 4 | } 5 | -------------------------------------------------------------------------------- /src/Entity.ts: -------------------------------------------------------------------------------- 1 | import { Component } from './Component' 2 | 3 | export class Entity { 4 | private components: Record = {} 5 | private didNotify = false 6 | private notify: () => void 7 | 8 | constructor (onChange: (entity: Entity) => void) { 9 | this.notify = () => { 10 | if (!this.didNotify) { 11 | this.didNotify = true 12 | onChange(this) 13 | } 14 | } 15 | } 16 | 17 | set (component: Component, value: T): this { 18 | const shouldNotify = !this.has(component) 19 | this.components[component] = value 20 | if (shouldNotify) { 21 | this.notify() 22 | } 23 | return this 24 | } 25 | 26 | has (component: Component): boolean { 27 | return Object.prototype.hasOwnProperty.call(this.components, component) 28 | } 29 | 30 | get (component: Component): T { 31 | const value = this.components[component] 32 | if (!value) { 33 | throw new TypeError('Component type not present.') 34 | } 35 | return value 36 | } 37 | 38 | remove (component: Component): this { 39 | delete this.components[component] 40 | this.notify() 41 | return this 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/EntityManager.ts: -------------------------------------------------------------------------------- 1 | import { Entity } from './Entity' 2 | import { Component } from './Component' 3 | import { Query } from './Query' 4 | 5 | export class EntityManager { 6 | private changed: Entity[] = [] 7 | private removed: Entity[] = [] 8 | 9 | private queries: Record = { 10 | '': new Query([], []) 11 | } 12 | 13 | create () { 14 | return new Entity(this.scheduleUpdate) 15 | } 16 | 17 | query (...components: Component[]): readonly Entity[] { 18 | const queryId = getQueryId(components) 19 | if (!this.queries[queryId]) { 20 | this.queries[queryId] = new Query(components, this.queries[''].entities) 21 | } 22 | return this.queries[queryId].entities 23 | } 24 | 25 | queryOne (...components: Component[]): Entity | undefined { 26 | return this.query(...components)[0] 27 | } 28 | 29 | scheduleUpdate = (entity: Entity) => this.changed.push(entity) 30 | 31 | scheduleRemove (entity: Entity) { 32 | this.removed.push(entity) 33 | } 34 | 35 | processUpdates () { 36 | for (const query of Object.values(this.queries)) { 37 | this.changed.forEach(entity => query.onChange(entity)) 38 | this.removed.forEach(entity => query.onRemove(entity)) 39 | } 40 | this.changed.forEach(entity => { entity['didNotify'] = false }) 41 | this.changed.length = 0 42 | this.removed.forEach(entity => { entity['didNotify'] = true }) 43 | this.removed.length = 0 44 | } 45 | } 46 | 47 | function getQueryId (components: Component[]) { 48 | return components.sort().join('+') 49 | } 50 | -------------------------------------------------------------------------------- /src/PriorityQueue.ts: -------------------------------------------------------------------------------- 1 | export class PriorityQueue { 2 | private elements: { value: T, priority: number }[] = [] 3 | 4 | enqueue (value: T, priority: number) { 5 | this.elements.push({ value, priority }) 6 | } 7 | 8 | dequeue () { 9 | let index = -1 10 | let maxPriority = -Infinity 11 | for (let i = 0; i < this.elements.length; i++) { 12 | if (this.elements[i].priority > maxPriority) { 13 | index = i 14 | maxPriority = this.elements[i].priority 15 | } 16 | } 17 | if (index !== -1) { 18 | const value = this.elements[index].value 19 | this.elements.splice(index, 1) 20 | return value 21 | } 22 | } 23 | 24 | isEmpty () { 25 | return this.elements.length === 0 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Query.ts: -------------------------------------------------------------------------------- 1 | import { Entity } from './Entity' 2 | import { Component } from './Component' 3 | 4 | export class Query { 5 | entities: Entity[] = [] 6 | private indices = new Map() 7 | 8 | constructor ( 9 | private components: Component[], 10 | entities: Entity[] 11 | ) { 12 | for (const entity of entities) { 13 | this.onChange(entity) 14 | } 15 | } 16 | 17 | onChange (entity: Entity) { 18 | if (this.components.every(component => entity.has(component))) { 19 | if (this.indices.get(entity) == null) { 20 | this.indices.set(entity, this.entities.length) 21 | this.entities.push(entity) 22 | } 23 | } else { 24 | this.onRemove(entity) 25 | } 26 | } 27 | 28 | onRemove (entity: Entity) { 29 | const index = this.indices.get(entity) 30 | if (index != null) { 31 | const last = this.entities.pop() 32 | if (last !== entity) { 33 | this.entities[index] = last 34 | this.indices.set(last, index) 35 | } 36 | this.indices.delete(entity) 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/System.ts: -------------------------------------------------------------------------------- 1 | import { World } from './World' 2 | 3 | export type System = (world: World, event: E) => void 4 | 5 | export function system ( 6 | event: { new(...args: any[]): T }, 7 | system: System 8 | ): System { 9 | return function (world, e) { 10 | if (e instanceof event) { 11 | return system(world, e) 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/World.ts: -------------------------------------------------------------------------------- 1 | import { Entity } from './Entity' 2 | import { Component } from './Component' 3 | import { EntityManager } from './EntityManager' 4 | import { System } from './System' 5 | import { PriorityQueue } from './PriorityQueue' 6 | 7 | export class World { 8 | private entityManager = new EntityManager() 9 | constructor ( 10 | private systems: System[] 11 | ) {} 12 | 13 | private running = false 14 | private events = new PriorityQueue() 15 | 16 | query (...components: Component[]): readonly Entity[] { 17 | this.ensureRunning() 18 | return this.entityManager.query(...components) 19 | } 20 | 21 | queryOne (...components: Component[]): Entity | undefined { 22 | this.ensureRunning() 23 | return this.query(...components)[0] 24 | } 25 | 26 | create (): Entity { 27 | this.ensureRunning() 28 | return this.entityManager.create() 29 | } 30 | 31 | remove (entity: Entity) { 32 | this.ensureRunning() 33 | return this.entityManager.scheduleRemove(entity) 34 | } 35 | 36 | emit (event: any, priority = 0) { 37 | this.ensureRunning() 38 | this.events.enqueue(event, priority) 39 | } 40 | 41 | run (callback: () => void) { 42 | if (this.running) { 43 | callback() 44 | return 45 | } 46 | this.running = true 47 | callback() 48 | this.entityManager.processUpdates() 49 | while (!this.events.isEmpty()) { 50 | const event = this.events.dequeue() 51 | for (const system of this.systems) { 52 | system(this, event) 53 | this.entityManager.processUpdates() 54 | } 55 | } 56 | this.running = false 57 | } 58 | 59 | private ensureRunning () { 60 | if (!this.running) { 61 | throw new Error('Outside synchronous systems you need to wrap calls to world in world.run()') 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/events.ts: -------------------------------------------------------------------------------- 1 | export class InitEvent {} 2 | 3 | export class UpdateTick { 4 | constructor ( 5 | readonly realTime: number, 6 | readonly time: number, 7 | readonly deltaTime: number 8 | ) {} 9 | } 10 | 11 | export class RenderTick {} 12 | -------------------------------------------------------------------------------- /src/gameClock.ts: -------------------------------------------------------------------------------- 1 | import { system } from './System' 2 | import { InitEvent, UpdateTick, RenderTick } from './events' 3 | 4 | function scheduleRaf (callback: () => void) { 5 | const id = requestAnimationFrame(callback) 6 | return () => cancelAnimationFrame(id) 7 | } 8 | 9 | function scheduleTimeout (callback: () => void) { 10 | const id = setTimeout(callback, 16) 11 | return () => clearTimeout(id) 12 | } 13 | 14 | const scheduleDefault = typeof requestAnimationFrame === 'function' ? scheduleRaf : scheduleTimeout 15 | 16 | export function gameClock ( 17 | ticksPerSecond = 60, 18 | maxDroppedTicks = ticksPerSecond, 19 | schedule = scheduleDefault 20 | ) { 21 | const deltaMs = 1000 / ticksPerSecond 22 | 23 | return system(InitEvent, function (world) { 24 | let lastTime = Date.now() 25 | let totalUpdates = 0 26 | 27 | update() 28 | function update () { 29 | world.run(() => { 30 | const now = Date.now() 31 | let droppedTicks = 0 32 | while (lastTime <= now) { 33 | droppedTicks++ 34 | if (droppedTicks <= maxDroppedTicks) { 35 | totalUpdates++ 36 | world.emit(new UpdateTick( 37 | now, 38 | totalUpdates / ticksPerSecond, 39 | 1 / ticksPerSecond 40 | )) 41 | } 42 | lastTime += deltaMs 43 | } 44 | world.emit(new RenderTick()) 45 | }) 46 | 47 | schedule(update) 48 | } 49 | }) 50 | } 51 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { Component, component } from './Component' 2 | export { Entity } from './Entity' 3 | export { InitEvent, UpdateTick, RenderTick } from './events' 4 | export { gameClock } from './gameClock' 5 | export { start } from './start' 6 | export { System, system } from './System' 7 | export { World } from './World' 8 | -------------------------------------------------------------------------------- /src/start.ts: -------------------------------------------------------------------------------- 1 | import { System } from './System' 2 | import { InitEvent } from './events' 3 | import { World } from './World' 4 | 5 | export function start (systems: System[]) { 6 | const world = new World(systems) 7 | world.run(() => world.emit(new InitEvent())) 8 | return world 9 | } 10 | -------------------------------------------------------------------------------- /test/Entity.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import { Entity } from '../src/Entity' 3 | import { component } from '../src' 4 | 5 | const A = component('A') 6 | const B = component('B') 7 | 8 | const createEntity = () => new Entity(() => {}) 9 | 10 | describe('Entity', () => { 11 | it('set() should add the component instance', () => { 12 | const result = createEntity() 13 | .set(A, 42) 14 | .get(A) 15 | 16 | expect(result).to.equal(42) 17 | }) 18 | 19 | it('set() should override the component instance', () => { 20 | const entity = createEntity() 21 | entity.set(A, 1) 22 | entity.set(A, 2) 23 | expect(entity.get(A)).to.equal(2) 24 | }) 25 | 26 | it('has() should return correct information', () => { 27 | const entity = createEntity().set(A, 1) 28 | 29 | expect(entity.has(A)).to.equal(true) 30 | expect(entity.has(B)).to.equal(false) 31 | }) 32 | 33 | it('get() should throw if component doesn\'t exist', () => { 34 | const entity = createEntity().set(A, 1) 35 | 36 | expect(() => entity.get(A)).not.to.throw() 37 | expect(() => entity.get(B)).to.throw() 38 | }) 39 | 40 | it('remove() should remove the component', () => { 41 | const entity = createEntity().set(A, 1) 42 | 43 | expect(entity.has(A)).to.equal(true) 44 | 45 | entity.remove(A) 46 | 47 | expect(entity.has(A)).to.equal(false) 48 | }) 49 | 50 | it('onChange correct call behaviour', () => { 51 | let callValue = undefined 52 | const onChange = (x: any) => { callValue = x } 53 | 54 | const entity = new Entity(onChange).set(A, 1) 55 | 56 | expect(callValue).to.equal(entity) 57 | callValue = undefined 58 | 59 | entity.set(B, 2) 60 | entity.remove(A) 61 | 62 | expect(callValue).to.equal(undefined) 63 | entity['didNotify'] = false 64 | 65 | entity.remove(B) 66 | 67 | expect(callValue).to.equal(entity) 68 | }) 69 | }) 70 | -------------------------------------------------------------------------------- /test/EntityManager.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import { Entity } from '../src/Entity' 3 | import { EntityManager } from '../src/EntityManager' 4 | import { component } from '../src' 5 | 6 | const A = component('A') 7 | const B = component('B') 8 | 9 | describe('EntityManager', () => { 10 | it('query returns empty array if there are no entities', () => { 11 | const em = new EntityManager() 12 | const entities = em.query(A, B) 13 | expect(entities).to.deep.equal([]) 14 | }) 15 | 16 | it('query returns empty array when no updates have been processed', () => { 17 | const em = new EntityManager() 18 | 19 | new Entity(em.scheduleUpdate) 20 | .set(A, 1) 21 | .set(B, 2) 22 | 23 | const entities = em.query(A, B) 24 | expect(entities).to.deep.equal([]) 25 | }) 26 | 27 | it('query returns matched entities after updates are processed', () => { 28 | const em = new EntityManager() 29 | const entity1 = new Entity(em.scheduleUpdate).set(A, 1).set(B, 2) 30 | const entity2 = new Entity(em.scheduleUpdate).set(A, 3).set(B, 4) 31 | new Entity(em.scheduleUpdate).set(A, 4) 32 | 33 | em.processUpdates() 34 | const entities = em.query(A, B) 35 | 36 | expect(entities).to.deep.equal([entity1, entity2]) 37 | }) 38 | 39 | it('query returns entities that have been changed after processUpdates', () => { 40 | const em = new EntityManager() 41 | const entity = new Entity(em.scheduleUpdate).set(A, 1).set(B, 2) 42 | 43 | em.processUpdates() 44 | const before = em.query(A, B) 45 | 46 | expect(before).to.deep.equal([entity]) 47 | 48 | entity.remove(A) 49 | const after = em.query(A, B) 50 | 51 | expect(after).to.deep.equal([entity]) 52 | }) 53 | 54 | it('queryOne returns a single entity', () => { 55 | const em = new EntityManager() 56 | const first = new Entity(em.scheduleUpdate).set(A, 1) 57 | const second = new Entity(em.scheduleUpdate).set(B, 2) 58 | 59 | em.processUpdates() 60 | const result = em.queryOne(A) 61 | 62 | expect(result === first || result === second).to.equal(true) 63 | }) 64 | 65 | it('queryOne can return undefined', () => { 66 | const em = new EntityManager() 67 | const result = em.queryOne(A) 68 | expect(result).to.equal(undefined) 69 | }) 70 | 71 | it('processUpdates updates the entity array', () => { 72 | const em = new EntityManager() 73 | const entity = new Entity(em.scheduleUpdate).set(A, 1).set(B, 2) 74 | 75 | em.processUpdates() 76 | const before = em.query(A, B) 77 | 78 | expect(before).to.deep.equal([entity]) 79 | 80 | entity.remove(A) 81 | em.processUpdates() 82 | const after = em.query(A, B) 83 | 84 | expect(after).to.deep.equal([]) 85 | }) 86 | 87 | it('processUpdates removes removed entities', () => { 88 | const em = new EntityManager() 89 | const entity = new Entity(em.scheduleUpdate).set(A, 1).set(B, 2) 90 | 91 | em.processUpdates() 92 | const before = em.query(A, B) 93 | 94 | expect(before).to.deep.equal([entity]) 95 | 96 | em.scheduleRemove(entity) 97 | em.processUpdates() 98 | const after = em.query(A, B) 99 | 100 | expect(after).to.deep.equal([]) 101 | }) 102 | }) 103 | -------------------------------------------------------------------------------- /test/PriorityQueue.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import { PriorityQueue } from '../src/PriorityQueue' 3 | 4 | describe('PriorityQueue', () => { 5 | it('is a FIFO for elements with the same priority', () => { 6 | const queue = new PriorityQueue() 7 | queue.enqueue('foo', 1) 8 | queue.enqueue('bar', 1) 9 | queue.enqueue('baz', 1) 10 | expect(queue.dequeue()).to.equal('foo') 11 | expect(queue.dequeue()).to.equal('bar') 12 | expect(queue.dequeue()).to.equal('baz') 13 | expect(queue.dequeue()).to.equal(undefined) 14 | }) 15 | 16 | it('returns isEmpty when there are no elements', () => { 17 | const queue = new PriorityQueue() 18 | expect(queue.isEmpty()).to.equal(true) 19 | queue.enqueue('foo', 1) 20 | expect(queue.isEmpty()).to.equal(false) 21 | queue.enqueue('bar', 2) 22 | expect(queue.isEmpty()).to.equal(false) 23 | queue.dequeue() 24 | expect(queue.isEmpty()).to.equal(false) 25 | queue.dequeue() 26 | expect(queue.isEmpty()).to.equal(true) 27 | }) 28 | 29 | it('dequeue maintains priorities', () => { 30 | const queue = new PriorityQueue() 31 | queue.enqueue('foo', 0) 32 | queue.enqueue('bar', 1) 33 | expect(queue.dequeue()).to.equal('bar') 34 | expect(queue.dequeue()).to.equal('foo') 35 | }) 36 | 37 | it('supports many different priorities', () => { 38 | const queue = new PriorityQueue() 39 | queue.enqueue('F', 2) 40 | queue.enqueue('A', 0) 41 | queue.enqueue('C', 1) 42 | queue.enqueue('B', 0) 43 | queue.enqueue('D', 1) 44 | queue.enqueue('G', 2) 45 | queue.enqueue('E', 1) 46 | expect(queue.dequeue()).to.equal('F') 47 | expect(queue.dequeue()).to.equal('G') 48 | expect(queue.dequeue()).to.equal('C') 49 | expect(queue.dequeue()).to.equal('D') 50 | expect(queue.dequeue()).to.equal('E') 51 | expect(queue.dequeue()).to.equal('A') 52 | expect(queue.dequeue()).to.equal('B') 53 | expect(queue.dequeue()).to.equal(undefined) 54 | }) 55 | }) 56 | -------------------------------------------------------------------------------- /test/Query.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import { Query } from '../src/Query' 3 | import { Entity, component } from '../src' 4 | 5 | const A = component('A') 6 | const B = component('B') 7 | 8 | const createEntity = () => new Entity(() => {}) 9 | 10 | describe('Query', () => { 11 | it('onChange should correctly modify the entities list', () => { 12 | const query = new Query([A], []) 13 | const entity = createEntity().set(A, 1) 14 | 15 | query.onChange(entity) 16 | 17 | expect(query.entities).to.deep.equal([entity]) 18 | 19 | entity.set(B, 2) 20 | query.onChange(entity) 21 | 22 | expect(query.entities).to.deep.equal([entity]) 23 | 24 | entity.remove(A) 25 | 26 | query.onChange(entity) 27 | expect(query.entities).to.deep.equal([]) 28 | }) 29 | 30 | it('onRemove should correctly modify the entities list', () => { 31 | const query = new Query([A], []) 32 | const entity = createEntity().set(A, 1) 33 | 34 | query.onChange(entity) 35 | expect(query.entities).to.deep.equal([entity]) 36 | 37 | query.onRemove(entity) 38 | expect(query.entities).to.deep.equal([]) 39 | }) 40 | 41 | it('handles multiple entities', () => { 42 | const query = new Query([A], []) 43 | 44 | const entityA = createEntity().set(A, 1) 45 | const entityB = createEntity().set(A, 1) 46 | 47 | query.onChange(entityA) 48 | query.onChange(entityB) 49 | expect(query.entities).to.deep.equal([entityA, entityB]) 50 | 51 | query.onRemove(entityA) 52 | query.onRemove(entityB) 53 | expect(query.entities).to.deep.equal([]) 54 | }) 55 | 56 | it('handles unknown entities', () => { 57 | const query = new Query([A], []) 58 | const entity = createEntity() 59 | 60 | query.onRemove(entity) 61 | 62 | expect(query.entities).to.deep.equal([]) 63 | }) 64 | 65 | it('filters its entities initially', () => { 66 | const entity1 = createEntity().set(A, 1) 67 | const entity2 = createEntity().set(A, 1) 68 | const query = new Query([A], [ 69 | entity1, 70 | entity2, 71 | createEntity().set(B, 2), 72 | ]) 73 | 74 | expect(query.entities).to.deep.equal([entity1, entity2]) 75 | }) 76 | 77 | it('handles multiple components', () => { 78 | const entity1 = createEntity().set(A, 1).set(B, 2) 79 | const entity2 = createEntity().set(A, 1) 80 | const entity3 = createEntity() 81 | 82 | const query = new Query([A, B], [entity1, entity2, entity3]) 83 | 84 | expect(query.entities).to.deep.equal([entity1]) 85 | }) 86 | }) 87 | -------------------------------------------------------------------------------- /test/System.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import { system } from '../src/System' 3 | 4 | class EventA {} 5 | class EventB {} 6 | 7 | describe('system', () => { 8 | it('calls the callback when the event matches', () => { 9 | let callValues = undefined 10 | const mySystem = system(EventA, (...args) => { callValues = args }) 11 | 12 | mySystem(null as any, new EventA()) 13 | 14 | expect(callValues).to.deep.equal([null, new EventA()]) 15 | }) 16 | 17 | it('does not call the callback when the event does not match', () => { 18 | let called = false 19 | const mySystem = system(EventA, () => { called = true }) 20 | 21 | mySystem(null as any, new EventB()) 22 | 23 | expect(called).to.equal(false) 24 | }) 25 | }) 26 | -------------------------------------------------------------------------------- /test/World.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import { component } from '../src/Component' 3 | import { Entity } from '../src/Entity' 4 | import { InitEvent } from '../src/events' 5 | import { system } from '../src/System' 6 | import { World } from '../src/World' 7 | 8 | describe('World', () => { 9 | describe('create', () => { 10 | it('throws if called outside run', () => { 11 | const world = new World([]) 12 | expect(() => world.create()).to.throw() 13 | }) 14 | 15 | it('creates a new entity', () => { 16 | const world = new World([]) 17 | let entity 18 | world.run(() => { entity = world.create() }) 19 | expect(entity).to.be.instanceOf(Entity) 20 | }) 21 | }) 22 | 23 | describe('emit', () => { 24 | it('throws if called outside run', () => { 25 | const world = new World([]) 26 | expect(() => world.emit(new InitEvent())).to.throw() 27 | }) 28 | 29 | it('emits events that can be picked up by systems', () => { 30 | class MyEvent {} 31 | let calls = 0 32 | 33 | const mySystem = system(MyEvent, () => { calls += 1 }) 34 | 35 | const world = new World([mySystem]) 36 | world.run(() => { 37 | world.emit(new MyEvent()) 38 | world.emit(new MyEvent()) 39 | world.emit(new MyEvent()) 40 | 41 | expect(calls).to.equal(0) 42 | }) 43 | 44 | expect(calls).to.equal(3) 45 | }) 46 | 47 | it('supports priority', () => { 48 | const events: any[] = [] 49 | 50 | const eventLog = (world: World, event: any) => events.push(event) 51 | const world = new World([eventLog]) 52 | 53 | world.run(() => { 54 | world.emit('foo') // default priority = 0 55 | world.emit('bar', 10) 56 | world.emit('baz', 2) 57 | }) 58 | 59 | expect(events).to.deep.equal(['bar', 'baz', 'foo']) 60 | }) 61 | }) 62 | 63 | describe('query', () => { 64 | it('throws if called outside run', () => { 65 | const world = new World([]) 66 | expect(() => world.query()).to.throw() 67 | }) 68 | 69 | it('can query entities', () => { 70 | const A = component('A') 71 | const B = component('B') 72 | 73 | const world = new World([]) 74 | world.run(() => { 75 | world.create().set(A, 1).set(B, 2) 76 | world.create().set(A, 3).set(B, 4) 77 | world.create().set(A, 5) 78 | world.create().set(B, 6) 79 | world.create() 80 | 81 | const entities = world.query(A, B) 82 | expect(entities.length).to.equal(0) 83 | }) 84 | world.run(() => { 85 | const entities = world.query(A, B) 86 | expect(entities.length).to.equal(2) 87 | }) 88 | }) 89 | }) 90 | 91 | describe('queryOne', () => { 92 | it('throws if called outside run', () => { 93 | const world = new World([]) 94 | expect(() => world.queryOne()).to.throw() 95 | }) 96 | 97 | it('can query entities', () => { 98 | const A = component('A') 99 | const B = component('B') 100 | 101 | const world = new World([]) 102 | world.run(() => { 103 | world.create().set(A, 1) 104 | world.create().set(A, 3) 105 | world.create() 106 | 107 | expect(world.queryOne(A)).to.equal(undefined) 108 | expect(world.queryOne(B)).to.equal(undefined) 109 | }) 110 | world.run(() => { 111 | expect(world.queryOne(A)).to.be.instanceOf(Entity) 112 | expect(world.queryOne(B)).to.equal(undefined) 113 | }) 114 | }) 115 | }) 116 | 117 | describe('remove', () => { 118 | it('throws if called outside run', () => { 119 | const world = new World([]) 120 | let entity: Entity 121 | world.run(() => { entity = world.create() }) 122 | expect(() => world.remove(entity)).to.throw() 123 | }) 124 | 125 | it('can remove entities', () => { 126 | const world = new World([]) 127 | let entity: Entity 128 | world.run(() => { entity = world.create() }) 129 | world.run(() => { world.remove(entity) }) 130 | world.run(() => { 131 | expect(world.query()).to.deep.equal([]) 132 | }) 133 | }) 134 | 135 | it('can remove entities that are later modified', () => { 136 | const A = component('A') 137 | const world = new World([]) 138 | let entity: Entity 139 | world.run(() => { entity = world.create() }) 140 | world.run(() => { world.remove(entity) }) 141 | world.run(() => { entity.set(A, 42) }) 142 | world.run(() => { 143 | expect(world.query()).to.deep.equal([]) 144 | }) 145 | }) 146 | }) 147 | }) 148 | -------------------------------------------------------------------------------- /test/index.test.ts: -------------------------------------------------------------------------------- 1 | import * as Rook from '../src' 2 | import { expect } from 'chai' 3 | 4 | describe('index', () => { 5 | it('exports everything that is required', () => { 6 | const A = Rook.component('A') 7 | const B = Rook.component('B') 8 | 9 | const init = Rook.system(Rook.InitEvent, (world, event) => { 10 | world.create() 11 | .set(A, 42) 12 | .set(B, 'foo') 13 | }) 14 | 15 | const world = Rook.start([init]) 16 | 17 | world.run(() => { 18 | const entities = world.query(A, B) 19 | expect(entities.length).to.equal(1) 20 | 21 | const entity = entities[0] 22 | expect(entity.get(A)).to.equal(42) 23 | expect(entity.get(B)).to.equal('foo') 24 | }) 25 | }) 26 | }) 27 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "src" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "sourceMap": true, 4 | "target": "es5", 5 | "lib": [ 6 | "esnext", 7 | "dom" 8 | ], 9 | "moduleResolution": "node", 10 | "module": "commonjs", 11 | "declaration": true, 12 | "strict": true, 13 | "noUnusedLocals": true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.10.4" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" 8 | integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/helper-validator-identifier@^7.10.4": 13 | version "7.10.4" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" 15 | integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== 16 | 17 | "@babel/highlight@^7.10.4": 18 | version "7.10.4" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" 20 | integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.10.4" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@types/chai@^4.2.12": 27 | version "4.2.12" 28 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.12.tgz#6160ae454cd89dae05adc3bb97997f488b608201" 29 | integrity sha512-aN5IAC8QNtSUdQzxu7lGBgYAOuU1tmRU4c9dIq5OKGf/SBVjXo+ffM2wEjudAWbgpOhy60nLoAGH1xm8fpCKFQ== 30 | 31 | "@types/color-name@^1.1.1": 32 | version "1.1.1" 33 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 34 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 35 | 36 | "@types/eslint-visitor-keys@^1.0.0": 37 | version "1.0.0" 38 | resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" 39 | integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== 40 | 41 | "@types/json-schema@^7.0.3": 42 | version "7.0.5" 43 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" 44 | integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== 45 | 46 | "@types/mocha@^8.0.2": 47 | version "8.0.2" 48 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.0.2.tgz#cdd160767c5a445bedef94ea8cfc8ab760fff42b" 49 | integrity sha512-5cv8rmqT3KX9XtWDvSgGYfS4OwrKM2eei90GWLnTYz+AXRiBv5uYcKBjnkQ4katNvfYk3+o2bHGZUsDhdcoUyg== 50 | 51 | "@typescript-eslint/eslint-plugin@^3.9.0": 52 | version "3.9.0" 53 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.9.0.tgz#0fe529b33d63c9a94f7503ca2bb12c84b9477ff3" 54 | integrity sha512-UD6b4p0/hSe1xdTvRCENSx7iQ+KR6ourlZFfYuPC7FlXEzdHuLPrEmuxZ23b2zW96KJX9Z3w05GE/wNOiEzrVg== 55 | dependencies: 56 | "@typescript-eslint/experimental-utils" "3.9.0" 57 | debug "^4.1.1" 58 | functional-red-black-tree "^1.0.1" 59 | regexpp "^3.0.0" 60 | semver "^7.3.2" 61 | tsutils "^3.17.1" 62 | 63 | "@typescript-eslint/experimental-utils@3.9.0": 64 | version "3.9.0" 65 | resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.9.0.tgz#3171d8ddba0bf02a8c2034188593630914fcf5ee" 66 | integrity sha512-/vSHUDYizSOhrOJdjYxPNGfb4a3ibO8zd4nUKo/QBFOmxosT3cVUV7KIg8Dwi6TXlr667G7YPqFK9+VSZOorNA== 67 | dependencies: 68 | "@types/json-schema" "^7.0.3" 69 | "@typescript-eslint/types" "3.9.0" 70 | "@typescript-eslint/typescript-estree" "3.9.0" 71 | eslint-scope "^5.0.0" 72 | eslint-utils "^2.0.0" 73 | 74 | "@typescript-eslint/parser@^3.9.0": 75 | version "3.9.0" 76 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.9.0.tgz#344978a265d9a5c7c8f13e62c78172a4374dabea" 77 | integrity sha512-rDHOKb6uW2jZkHQniUQVZkixQrfsZGUCNWWbKWep4A5hGhN5dLHMUCNAWnC4tXRlHedXkTDptIpxs6e4Pz8UfA== 78 | dependencies: 79 | "@types/eslint-visitor-keys" "^1.0.0" 80 | "@typescript-eslint/experimental-utils" "3.9.0" 81 | "@typescript-eslint/types" "3.9.0" 82 | "@typescript-eslint/typescript-estree" "3.9.0" 83 | eslint-visitor-keys "^1.1.0" 84 | 85 | "@typescript-eslint/types@3.9.0": 86 | version "3.9.0" 87 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.9.0.tgz#be9d0aa451e1bf3ce99f2e6920659e5b2e6bfe18" 88 | integrity sha512-rb6LDr+dk9RVVXO/NJE8dT1pGlso3voNdEIN8ugm4CWM5w5GimbThCMiMl4da1t5u3YwPWEwOnKAULCZgBtBHg== 89 | 90 | "@typescript-eslint/typescript-estree@3.9.0": 91 | version "3.9.0" 92 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.9.0.tgz#c6abbb50fa0d715cab46fef67ca6378bf2eaca13" 93 | integrity sha512-N+158NKgN4rOmWVfvKOMoMFV5n8XxAliaKkArm/sOypzQ0bUL8MSnOEBW3VFIeffb/K5ce/cAV0yYhR7U4ALAA== 94 | dependencies: 95 | "@typescript-eslint/types" "3.9.0" 96 | "@typescript-eslint/visitor-keys" "3.9.0" 97 | debug "^4.1.1" 98 | glob "^7.1.6" 99 | is-glob "^4.0.1" 100 | lodash "^4.17.15" 101 | semver "^7.3.2" 102 | tsutils "^3.17.1" 103 | 104 | "@typescript-eslint/visitor-keys@3.9.0": 105 | version "3.9.0" 106 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.9.0.tgz#44de8e1b1df67adaf3b94d6b60b80f8faebc8dd3" 107 | integrity sha512-O1qeoGqDbu0EZUC/MZ6F1WHTIzcBVhGqDj3LhTnj65WUA548RXVxUHbYhAW9bZWfb2rnX9QsbbP5nmeJ5Z4+ng== 108 | dependencies: 109 | eslint-visitor-keys "^1.1.0" 110 | 111 | acorn-jsx@^5.2.0: 112 | version "5.2.0" 113 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" 114 | integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== 115 | 116 | acorn@^7.3.1: 117 | version "7.4.0" 118 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" 119 | integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== 120 | 121 | ajv@^6.10.0, ajv@^6.10.2: 122 | version "6.12.3" 123 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" 124 | integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== 125 | dependencies: 126 | fast-deep-equal "^3.1.1" 127 | fast-json-stable-stringify "^2.0.0" 128 | json-schema-traverse "^0.4.1" 129 | uri-js "^4.2.2" 130 | 131 | ansi-colors@4.1.1, ansi-colors@^4.1.1: 132 | version "4.1.1" 133 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 134 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 135 | 136 | ansi-regex@^3.0.0: 137 | version "3.0.0" 138 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 139 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 140 | 141 | ansi-regex@^4.1.0: 142 | version "4.1.0" 143 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 144 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 145 | 146 | ansi-regex@^5.0.0: 147 | version "5.0.0" 148 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 149 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 150 | 151 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 152 | version "3.2.1" 153 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 154 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 155 | dependencies: 156 | color-convert "^1.9.0" 157 | 158 | ansi-styles@^4.1.0: 159 | version "4.2.1" 160 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 161 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 162 | dependencies: 163 | "@types/color-name" "^1.1.1" 164 | color-convert "^2.0.1" 165 | 166 | anymatch@~3.1.1: 167 | version "3.1.1" 168 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 169 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 170 | dependencies: 171 | normalize-path "^3.0.0" 172 | picomatch "^2.0.4" 173 | 174 | arg@^4.1.0: 175 | version "4.1.3" 176 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 177 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 178 | 179 | argparse@^1.0.7: 180 | version "1.0.10" 181 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 182 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 183 | dependencies: 184 | sprintf-js "~1.0.2" 185 | 186 | array.prototype.map@^1.0.1: 187 | version "1.0.2" 188 | resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" 189 | integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== 190 | dependencies: 191 | define-properties "^1.1.3" 192 | es-abstract "^1.17.0-next.1" 193 | es-array-method-boxes-properly "^1.0.0" 194 | is-string "^1.0.4" 195 | 196 | assertion-error@^1.1.0: 197 | version "1.1.0" 198 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 199 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 200 | 201 | astral-regex@^1.0.0: 202 | version "1.0.0" 203 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 204 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 205 | 206 | balanced-match@^1.0.0: 207 | version "1.0.0" 208 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 209 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 210 | 211 | binary-extensions@^2.0.0: 212 | version "2.1.0" 213 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" 214 | integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== 215 | 216 | brace-expansion@^1.1.7: 217 | version "1.1.11" 218 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 219 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 220 | dependencies: 221 | balanced-match "^1.0.0" 222 | concat-map "0.0.1" 223 | 224 | braces@~3.0.2: 225 | version "3.0.2" 226 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 227 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 228 | dependencies: 229 | fill-range "^7.0.1" 230 | 231 | browser-stdout@1.3.1: 232 | version "1.3.1" 233 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 234 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 235 | 236 | buffer-from@^1.0.0: 237 | version "1.1.1" 238 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 239 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 240 | 241 | callsites@^3.0.0: 242 | version "3.1.0" 243 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 244 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 245 | 246 | camelcase@^5.0.0, camelcase@^5.3.1: 247 | version "5.3.1" 248 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 249 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 250 | 251 | chai@^4.2.0: 252 | version "4.2.0" 253 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" 254 | integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== 255 | dependencies: 256 | assertion-error "^1.1.0" 257 | check-error "^1.0.2" 258 | deep-eql "^3.0.1" 259 | get-func-name "^2.0.0" 260 | pathval "^1.1.0" 261 | type-detect "^4.0.5" 262 | 263 | chalk@^2.0.0, chalk@^2.4.2: 264 | version "2.4.2" 265 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 266 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 267 | dependencies: 268 | ansi-styles "^3.2.1" 269 | escape-string-regexp "^1.0.5" 270 | supports-color "^5.3.0" 271 | 272 | chalk@^4.0.0: 273 | version "4.1.0" 274 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 275 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 276 | dependencies: 277 | ansi-styles "^4.1.0" 278 | supports-color "^7.1.0" 279 | 280 | check-error@^1.0.2: 281 | version "1.0.2" 282 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 283 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 284 | 285 | chokidar@3.3.1: 286 | version "3.3.1" 287 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" 288 | integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== 289 | dependencies: 290 | anymatch "~3.1.1" 291 | braces "~3.0.2" 292 | glob-parent "~5.1.0" 293 | is-binary-path "~2.1.0" 294 | is-glob "~4.0.1" 295 | normalize-path "~3.0.0" 296 | readdirp "~3.3.0" 297 | optionalDependencies: 298 | fsevents "~2.1.2" 299 | 300 | cliui@^5.0.0: 301 | version "5.0.0" 302 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 303 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 304 | dependencies: 305 | string-width "^3.1.0" 306 | strip-ansi "^5.2.0" 307 | wrap-ansi "^5.1.0" 308 | 309 | color-convert@^1.9.0: 310 | version "1.9.3" 311 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 312 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 313 | dependencies: 314 | color-name "1.1.3" 315 | 316 | color-convert@^2.0.1: 317 | version "2.0.1" 318 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 319 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 320 | dependencies: 321 | color-name "~1.1.4" 322 | 323 | color-name@1.1.3: 324 | version "1.1.3" 325 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 326 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 327 | 328 | color-name@~1.1.4: 329 | version "1.1.4" 330 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 331 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 332 | 333 | concat-map@0.0.1: 334 | version "0.0.1" 335 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 336 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 337 | 338 | cross-spawn@^7.0.2: 339 | version "7.0.3" 340 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 341 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 342 | dependencies: 343 | path-key "^3.1.0" 344 | shebang-command "^2.0.0" 345 | which "^2.0.1" 346 | 347 | debug@3.2.6: 348 | version "3.2.6" 349 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 350 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 351 | dependencies: 352 | ms "^2.1.1" 353 | 354 | debug@^4.0.1, debug@^4.1.1: 355 | version "4.1.1" 356 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 357 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 358 | dependencies: 359 | ms "^2.1.1" 360 | 361 | decamelize@^1.2.0: 362 | version "1.2.0" 363 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 364 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 365 | 366 | deep-eql@^3.0.1: 367 | version "3.0.1" 368 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 369 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 370 | dependencies: 371 | type-detect "^4.0.0" 372 | 373 | deep-is@^0.1.3: 374 | version "0.1.3" 375 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 376 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 377 | 378 | define-properties@^1.1.2, define-properties@^1.1.3: 379 | version "1.1.3" 380 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 381 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 382 | dependencies: 383 | object-keys "^1.0.12" 384 | 385 | diff@4.0.2, diff@^4.0.1: 386 | version "4.0.2" 387 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 388 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 389 | 390 | doctrine@^3.0.0: 391 | version "3.0.0" 392 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 393 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 394 | dependencies: 395 | esutils "^2.0.2" 396 | 397 | emoji-regex@^7.0.1: 398 | version "7.0.3" 399 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 400 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 401 | 402 | enquirer@^2.3.5: 403 | version "2.3.6" 404 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" 405 | integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== 406 | dependencies: 407 | ansi-colors "^4.1.1" 408 | 409 | es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: 410 | version "1.17.6" 411 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" 412 | integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== 413 | dependencies: 414 | es-to-primitive "^1.2.1" 415 | function-bind "^1.1.1" 416 | has "^1.0.3" 417 | has-symbols "^1.0.1" 418 | is-callable "^1.2.0" 419 | is-regex "^1.1.0" 420 | object-inspect "^1.7.0" 421 | object-keys "^1.1.1" 422 | object.assign "^4.1.0" 423 | string.prototype.trimend "^1.0.1" 424 | string.prototype.trimstart "^1.0.1" 425 | 426 | es-array-method-boxes-properly@^1.0.0: 427 | version "1.0.0" 428 | resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" 429 | integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== 430 | 431 | es-get-iterator@^1.0.2: 432 | version "1.1.0" 433 | resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" 434 | integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== 435 | dependencies: 436 | es-abstract "^1.17.4" 437 | has-symbols "^1.0.1" 438 | is-arguments "^1.0.4" 439 | is-map "^2.0.1" 440 | is-set "^2.0.1" 441 | is-string "^1.0.5" 442 | isarray "^2.0.5" 443 | 444 | es-to-primitive@^1.2.1: 445 | version "1.2.1" 446 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 447 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 448 | dependencies: 449 | is-callable "^1.1.4" 450 | is-date-object "^1.0.1" 451 | is-symbol "^1.0.2" 452 | 453 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 454 | version "1.0.5" 455 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 456 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 457 | 458 | eslint-scope@^5.0.0, eslint-scope@^5.1.0: 459 | version "5.1.0" 460 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" 461 | integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== 462 | dependencies: 463 | esrecurse "^4.1.0" 464 | estraverse "^4.1.1" 465 | 466 | eslint-utils@^2.0.0, eslint-utils@^2.1.0: 467 | version "2.1.0" 468 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 469 | integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 470 | dependencies: 471 | eslint-visitor-keys "^1.1.0" 472 | 473 | eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: 474 | version "1.3.0" 475 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 476 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 477 | 478 | eslint@^7.6.0: 479 | version "7.6.0" 480 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.6.0.tgz#522d67cfaea09724d96949c70e7a0550614d64d6" 481 | integrity sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w== 482 | dependencies: 483 | "@babel/code-frame" "^7.0.0" 484 | ajv "^6.10.0" 485 | chalk "^4.0.0" 486 | cross-spawn "^7.0.2" 487 | debug "^4.0.1" 488 | doctrine "^3.0.0" 489 | enquirer "^2.3.5" 490 | eslint-scope "^5.1.0" 491 | eslint-utils "^2.1.0" 492 | eslint-visitor-keys "^1.3.0" 493 | espree "^7.2.0" 494 | esquery "^1.2.0" 495 | esutils "^2.0.2" 496 | file-entry-cache "^5.0.1" 497 | functional-red-black-tree "^1.0.1" 498 | glob-parent "^5.0.0" 499 | globals "^12.1.0" 500 | ignore "^4.0.6" 501 | import-fresh "^3.0.0" 502 | imurmurhash "^0.1.4" 503 | is-glob "^4.0.0" 504 | js-yaml "^3.13.1" 505 | json-stable-stringify-without-jsonify "^1.0.1" 506 | levn "^0.4.1" 507 | lodash "^4.17.19" 508 | minimatch "^3.0.4" 509 | natural-compare "^1.4.0" 510 | optionator "^0.9.1" 511 | progress "^2.0.0" 512 | regexpp "^3.1.0" 513 | semver "^7.2.1" 514 | strip-ansi "^6.0.0" 515 | strip-json-comments "^3.1.0" 516 | table "^5.2.3" 517 | text-table "^0.2.0" 518 | v8-compile-cache "^2.0.3" 519 | 520 | espree@^7.2.0: 521 | version "7.2.0" 522 | resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" 523 | integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== 524 | dependencies: 525 | acorn "^7.3.1" 526 | acorn-jsx "^5.2.0" 527 | eslint-visitor-keys "^1.3.0" 528 | 529 | esprima@^4.0.0: 530 | version "4.0.1" 531 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 532 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 533 | 534 | esquery@^1.2.0: 535 | version "1.3.1" 536 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" 537 | integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== 538 | dependencies: 539 | estraverse "^5.1.0" 540 | 541 | esrecurse@^4.1.0: 542 | version "4.2.1" 543 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 544 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 545 | dependencies: 546 | estraverse "^4.1.0" 547 | 548 | estraverse@^4.1.0, estraverse@^4.1.1: 549 | version "4.3.0" 550 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 551 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 552 | 553 | estraverse@^5.1.0: 554 | version "5.2.0" 555 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 556 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 557 | 558 | esutils@^2.0.2: 559 | version "2.0.3" 560 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 561 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 562 | 563 | fast-deep-equal@^3.1.1: 564 | version "3.1.3" 565 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 566 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 567 | 568 | fast-json-stable-stringify@^2.0.0: 569 | version "2.1.0" 570 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 571 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 572 | 573 | fast-levenshtein@^2.0.6: 574 | version "2.0.6" 575 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 576 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 577 | 578 | file-entry-cache@^5.0.1: 579 | version "5.0.1" 580 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 581 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 582 | dependencies: 583 | flat-cache "^2.0.1" 584 | 585 | fill-range@^7.0.1: 586 | version "7.0.1" 587 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 588 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 589 | dependencies: 590 | to-regex-range "^5.0.1" 591 | 592 | find-up@4.1.0: 593 | version "4.1.0" 594 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 595 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 596 | dependencies: 597 | locate-path "^5.0.0" 598 | path-exists "^4.0.0" 599 | 600 | find-up@^3.0.0: 601 | version "3.0.0" 602 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 603 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 604 | dependencies: 605 | locate-path "^3.0.0" 606 | 607 | flat-cache@^2.0.1: 608 | version "2.0.1" 609 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 610 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 611 | dependencies: 612 | flatted "^2.0.0" 613 | rimraf "2.6.3" 614 | write "1.0.3" 615 | 616 | flat@^4.1.0: 617 | version "4.1.0" 618 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 619 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 620 | dependencies: 621 | is-buffer "~2.0.3" 622 | 623 | flatted@^2.0.0: 624 | version "2.0.2" 625 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" 626 | integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== 627 | 628 | fs.realpath@^1.0.0: 629 | version "1.0.0" 630 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 631 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 632 | 633 | fsevents@~2.1.2: 634 | version "2.1.3" 635 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 636 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 637 | 638 | function-bind@^1.1.1: 639 | version "1.1.1" 640 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 641 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 642 | 643 | functional-red-black-tree@^1.0.1: 644 | version "1.0.1" 645 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 646 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 647 | 648 | get-caller-file@^2.0.1: 649 | version "2.0.5" 650 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 651 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 652 | 653 | get-func-name@^2.0.0: 654 | version "2.0.0" 655 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 656 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 657 | 658 | glob-parent@^5.0.0, glob-parent@~5.1.0: 659 | version "5.1.1" 660 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 661 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 662 | dependencies: 663 | is-glob "^4.0.1" 664 | 665 | glob@7.1.6, glob@^7.1.3, glob@^7.1.6: 666 | version "7.1.6" 667 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 668 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 669 | dependencies: 670 | fs.realpath "^1.0.0" 671 | inflight "^1.0.4" 672 | inherits "2" 673 | minimatch "^3.0.4" 674 | once "^1.3.0" 675 | path-is-absolute "^1.0.0" 676 | 677 | globals@^12.1.0: 678 | version "12.4.0" 679 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" 680 | integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== 681 | dependencies: 682 | type-fest "^0.8.1" 683 | 684 | growl@1.10.5: 685 | version "1.10.5" 686 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 687 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 688 | 689 | has-flag@^3.0.0: 690 | version "3.0.0" 691 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 692 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 693 | 694 | has-flag@^4.0.0: 695 | version "4.0.0" 696 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 697 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 698 | 699 | has-symbols@^1.0.0: 700 | version "1.0.0" 701 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 702 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 703 | 704 | has-symbols@^1.0.1: 705 | version "1.0.1" 706 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 707 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 708 | 709 | has@^1.0.3: 710 | version "1.0.3" 711 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 712 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 713 | dependencies: 714 | function-bind "^1.1.1" 715 | 716 | he@1.2.0: 717 | version "1.2.0" 718 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 719 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 720 | 721 | ignore@^4.0.6: 722 | version "4.0.6" 723 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 724 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 725 | 726 | import-fresh@^3.0.0: 727 | version "3.2.1" 728 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 729 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 730 | dependencies: 731 | parent-module "^1.0.0" 732 | resolve-from "^4.0.0" 733 | 734 | imurmurhash@^0.1.4: 735 | version "0.1.4" 736 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 737 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 738 | 739 | inflight@^1.0.4: 740 | version "1.0.6" 741 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 742 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 743 | dependencies: 744 | once "^1.3.0" 745 | wrappy "1" 746 | 747 | inherits@2: 748 | version "2.0.3" 749 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 750 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 751 | 752 | is-arguments@^1.0.4: 753 | version "1.0.4" 754 | resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" 755 | integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== 756 | 757 | is-binary-path@~2.1.0: 758 | version "2.1.0" 759 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 760 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 761 | dependencies: 762 | binary-extensions "^2.0.0" 763 | 764 | is-buffer@~2.0.3: 765 | version "2.0.4" 766 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 767 | integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== 768 | 769 | is-callable@^1.1.4: 770 | version "1.1.4" 771 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 772 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 773 | 774 | is-callable@^1.2.0: 775 | version "1.2.0" 776 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 777 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== 778 | 779 | is-date-object@^1.0.1: 780 | version "1.0.1" 781 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 782 | integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 783 | 784 | is-extglob@^2.1.1: 785 | version "2.1.1" 786 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 787 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 788 | 789 | is-fullwidth-code-point@^2.0.0: 790 | version "2.0.0" 791 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 792 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 793 | 794 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: 795 | version "4.0.1" 796 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 797 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 798 | dependencies: 799 | is-extglob "^2.1.1" 800 | 801 | is-map@^2.0.1: 802 | version "2.0.1" 803 | resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" 804 | integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== 805 | 806 | is-number@^7.0.0: 807 | version "7.0.0" 808 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 809 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 810 | 811 | is-plain-obj@^1.1.0: 812 | version "1.1.0" 813 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 814 | integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= 815 | 816 | is-regex@^1.1.0: 817 | version "1.1.1" 818 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" 819 | integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== 820 | dependencies: 821 | has-symbols "^1.0.1" 822 | 823 | is-set@^2.0.1: 824 | version "2.0.1" 825 | resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" 826 | integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== 827 | 828 | is-string@^1.0.4, is-string@^1.0.5: 829 | version "1.0.5" 830 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 831 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 832 | 833 | is-symbol@^1.0.2: 834 | version "1.0.2" 835 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 836 | integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 837 | dependencies: 838 | has-symbols "^1.0.0" 839 | 840 | isarray@^2.0.5: 841 | version "2.0.5" 842 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" 843 | integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== 844 | 845 | isexe@^2.0.0: 846 | version "2.0.0" 847 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 848 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 849 | 850 | iterate-iterator@^1.0.1: 851 | version "1.0.1" 852 | resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" 853 | integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== 854 | 855 | iterate-value@^1.0.0: 856 | version "1.0.2" 857 | resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" 858 | integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== 859 | dependencies: 860 | es-get-iterator "^1.0.2" 861 | iterate-iterator "^1.0.1" 862 | 863 | js-tokens@^4.0.0: 864 | version "4.0.0" 865 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 866 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 867 | 868 | js-yaml@3.13.1: 869 | version "3.13.1" 870 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 871 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 872 | dependencies: 873 | argparse "^1.0.7" 874 | esprima "^4.0.0" 875 | 876 | js-yaml@^3.13.1: 877 | version "3.14.0" 878 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" 879 | integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== 880 | dependencies: 881 | argparse "^1.0.7" 882 | esprima "^4.0.0" 883 | 884 | json-schema-traverse@^0.4.1: 885 | version "0.4.1" 886 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 887 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 888 | 889 | json-stable-stringify-without-jsonify@^1.0.1: 890 | version "1.0.1" 891 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 892 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 893 | 894 | levn@^0.4.1: 895 | version "0.4.1" 896 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 897 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 898 | dependencies: 899 | prelude-ls "^1.2.1" 900 | type-check "~0.4.0" 901 | 902 | locate-path@^3.0.0: 903 | version "3.0.0" 904 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 905 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 906 | dependencies: 907 | p-locate "^3.0.0" 908 | path-exists "^3.0.0" 909 | 910 | locate-path@^5.0.0: 911 | version "5.0.0" 912 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 913 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 914 | dependencies: 915 | p-locate "^4.1.0" 916 | 917 | lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: 918 | version "4.17.19" 919 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 920 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 921 | 922 | log-symbols@3.0.0: 923 | version "3.0.0" 924 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" 925 | integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== 926 | dependencies: 927 | chalk "^2.4.2" 928 | 929 | make-error@^1.1.1: 930 | version "1.3.6" 931 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 932 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 933 | 934 | minimatch@3.0.4, minimatch@^3.0.4: 935 | version "3.0.4" 936 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 937 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 938 | dependencies: 939 | brace-expansion "^1.1.7" 940 | 941 | minimist@^1.2.5: 942 | version "1.2.5" 943 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 944 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 945 | 946 | mkdirp@^0.5.1: 947 | version "0.5.5" 948 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 949 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 950 | dependencies: 951 | minimist "^1.2.5" 952 | 953 | mocha@^8.1.1: 954 | version "8.1.1" 955 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.1.1.tgz#1de1ba4e9a2c955d96b84e469d7540848223592d" 956 | integrity sha512-p7FuGlYH8t7gaiodlFreseLxEmxTgvyG9RgPHODFPySNhwUehu8NIb0vdSt3WFckSneswZ0Un5typYcWElk7HQ== 957 | dependencies: 958 | ansi-colors "4.1.1" 959 | browser-stdout "1.3.1" 960 | chokidar "3.3.1" 961 | debug "3.2.6" 962 | diff "4.0.2" 963 | escape-string-regexp "1.0.5" 964 | find-up "4.1.0" 965 | glob "7.1.6" 966 | growl "1.10.5" 967 | he "1.2.0" 968 | js-yaml "3.13.1" 969 | log-symbols "3.0.0" 970 | minimatch "3.0.4" 971 | ms "2.1.2" 972 | object.assign "4.1.0" 973 | promise.allsettled "1.0.2" 974 | serialize-javascript "4.0.0" 975 | strip-json-comments "3.0.1" 976 | supports-color "7.1.0" 977 | which "2.0.2" 978 | wide-align "1.1.3" 979 | workerpool "6.0.0" 980 | yargs "13.3.2" 981 | yargs-parser "13.1.2" 982 | yargs-unparser "1.6.1" 983 | 984 | ms@2.1.2: 985 | version "2.1.2" 986 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 987 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 988 | 989 | ms@^2.1.1: 990 | version "2.1.1" 991 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 992 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 993 | 994 | natural-compare@^1.4.0: 995 | version "1.4.0" 996 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 997 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 998 | 999 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1000 | version "3.0.0" 1001 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1002 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1003 | 1004 | object-inspect@^1.7.0: 1005 | version "1.8.0" 1006 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" 1007 | integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== 1008 | 1009 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1010 | version "1.1.1" 1011 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1012 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1013 | 1014 | object.assign@4.1.0, object.assign@^4.1.0: 1015 | version "4.1.0" 1016 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1017 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1018 | dependencies: 1019 | define-properties "^1.1.2" 1020 | function-bind "^1.1.1" 1021 | has-symbols "^1.0.0" 1022 | object-keys "^1.0.11" 1023 | 1024 | once@^1.3.0: 1025 | version "1.4.0" 1026 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1027 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1028 | dependencies: 1029 | wrappy "1" 1030 | 1031 | optionator@^0.9.1: 1032 | version "0.9.1" 1033 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1034 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1035 | dependencies: 1036 | deep-is "^0.1.3" 1037 | fast-levenshtein "^2.0.6" 1038 | levn "^0.4.1" 1039 | prelude-ls "^1.2.1" 1040 | type-check "^0.4.0" 1041 | word-wrap "^1.2.3" 1042 | 1043 | p-limit@^2.0.0: 1044 | version "2.2.0" 1045 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" 1046 | integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== 1047 | dependencies: 1048 | p-try "^2.0.0" 1049 | 1050 | p-limit@^2.2.0: 1051 | version "2.3.0" 1052 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1053 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1054 | dependencies: 1055 | p-try "^2.0.0" 1056 | 1057 | p-locate@^3.0.0: 1058 | version "3.0.0" 1059 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1060 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1061 | dependencies: 1062 | p-limit "^2.0.0" 1063 | 1064 | p-locate@^4.1.0: 1065 | version "4.1.0" 1066 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1067 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1068 | dependencies: 1069 | p-limit "^2.2.0" 1070 | 1071 | p-try@^2.0.0: 1072 | version "2.2.0" 1073 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1074 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1075 | 1076 | parent-module@^1.0.0: 1077 | version "1.0.1" 1078 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1079 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1080 | dependencies: 1081 | callsites "^3.0.0" 1082 | 1083 | path-exists@^3.0.0: 1084 | version "3.0.0" 1085 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1086 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1087 | 1088 | path-exists@^4.0.0: 1089 | version "4.0.0" 1090 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1091 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1092 | 1093 | path-is-absolute@^1.0.0: 1094 | version "1.0.1" 1095 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1096 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1097 | 1098 | path-key@^3.1.0: 1099 | version "3.1.1" 1100 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1101 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1102 | 1103 | pathval@^1.1.0: 1104 | version "1.1.0" 1105 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 1106 | integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= 1107 | 1108 | picomatch@^2.0.4, picomatch@^2.0.7: 1109 | version "2.2.2" 1110 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1111 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1112 | 1113 | prelude-ls@^1.2.1: 1114 | version "1.2.1" 1115 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1116 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1117 | 1118 | progress@^2.0.0: 1119 | version "2.0.3" 1120 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1121 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1122 | 1123 | promise.allsettled@1.0.2: 1124 | version "1.0.2" 1125 | resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9" 1126 | integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg== 1127 | dependencies: 1128 | array.prototype.map "^1.0.1" 1129 | define-properties "^1.1.3" 1130 | es-abstract "^1.17.0-next.1" 1131 | function-bind "^1.1.1" 1132 | iterate-value "^1.0.0" 1133 | 1134 | punycode@^2.1.0: 1135 | version "2.1.1" 1136 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1137 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1138 | 1139 | randombytes@^2.1.0: 1140 | version "2.1.0" 1141 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1142 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1143 | dependencies: 1144 | safe-buffer "^5.1.0" 1145 | 1146 | readdirp@~3.3.0: 1147 | version "3.3.0" 1148 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" 1149 | integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== 1150 | dependencies: 1151 | picomatch "^2.0.7" 1152 | 1153 | regexpp@^3.0.0, regexpp@^3.1.0: 1154 | version "3.1.0" 1155 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" 1156 | integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== 1157 | 1158 | require-directory@^2.1.1: 1159 | version "2.1.1" 1160 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1161 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1162 | 1163 | require-main-filename@^2.0.0: 1164 | version "2.0.0" 1165 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1166 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1167 | 1168 | resolve-from@^4.0.0: 1169 | version "4.0.0" 1170 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1171 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1172 | 1173 | rimraf@2.6.3: 1174 | version "2.6.3" 1175 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1176 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1177 | dependencies: 1178 | glob "^7.1.3" 1179 | 1180 | safe-buffer@^5.1.0: 1181 | version "5.2.1" 1182 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1183 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1184 | 1185 | semver@^7.2.1, semver@^7.3.2: 1186 | version "7.3.2" 1187 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" 1188 | integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== 1189 | 1190 | serialize-javascript@4.0.0: 1191 | version "4.0.0" 1192 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" 1193 | integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== 1194 | dependencies: 1195 | randombytes "^2.1.0" 1196 | 1197 | set-blocking@^2.0.0: 1198 | version "2.0.0" 1199 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1200 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1201 | 1202 | shebang-command@^2.0.0: 1203 | version "2.0.0" 1204 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1205 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1206 | dependencies: 1207 | shebang-regex "^3.0.0" 1208 | 1209 | shebang-regex@^3.0.0: 1210 | version "3.0.0" 1211 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1212 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1213 | 1214 | slice-ansi@^2.1.0: 1215 | version "2.1.0" 1216 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1217 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1218 | dependencies: 1219 | ansi-styles "^3.2.0" 1220 | astral-regex "^1.0.0" 1221 | is-fullwidth-code-point "^2.0.0" 1222 | 1223 | source-map-support@^0.5.17: 1224 | version "0.5.19" 1225 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 1226 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1227 | dependencies: 1228 | buffer-from "^1.0.0" 1229 | source-map "^0.6.0" 1230 | 1231 | source-map@^0.6.0: 1232 | version "0.6.1" 1233 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1234 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1235 | 1236 | sprintf-js@~1.0.2: 1237 | version "1.0.3" 1238 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1239 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1240 | 1241 | "string-width@^1.0.2 || 2": 1242 | version "2.1.1" 1243 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1244 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1245 | dependencies: 1246 | is-fullwidth-code-point "^2.0.0" 1247 | strip-ansi "^4.0.0" 1248 | 1249 | string-width@^3.0.0, string-width@^3.1.0: 1250 | version "3.1.0" 1251 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1252 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1253 | dependencies: 1254 | emoji-regex "^7.0.1" 1255 | is-fullwidth-code-point "^2.0.0" 1256 | strip-ansi "^5.1.0" 1257 | 1258 | string.prototype.trimend@^1.0.1: 1259 | version "1.0.1" 1260 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 1261 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 1262 | dependencies: 1263 | define-properties "^1.1.3" 1264 | es-abstract "^1.17.5" 1265 | 1266 | string.prototype.trimstart@^1.0.1: 1267 | version "1.0.1" 1268 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 1269 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 1270 | dependencies: 1271 | define-properties "^1.1.3" 1272 | es-abstract "^1.17.5" 1273 | 1274 | strip-ansi@^4.0.0: 1275 | version "4.0.0" 1276 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1277 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1278 | dependencies: 1279 | ansi-regex "^3.0.0" 1280 | 1281 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1282 | version "5.2.0" 1283 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1284 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1285 | dependencies: 1286 | ansi-regex "^4.1.0" 1287 | 1288 | strip-ansi@^6.0.0: 1289 | version "6.0.0" 1290 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1291 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1292 | dependencies: 1293 | ansi-regex "^5.0.0" 1294 | 1295 | strip-json-comments@3.0.1: 1296 | version "3.0.1" 1297 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" 1298 | integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== 1299 | 1300 | strip-json-comments@^3.1.0: 1301 | version "3.1.1" 1302 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1303 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1304 | 1305 | supports-color@7.1.0, supports-color@^7.1.0: 1306 | version "7.1.0" 1307 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1308 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1309 | dependencies: 1310 | has-flag "^4.0.0" 1311 | 1312 | supports-color@^5.3.0: 1313 | version "5.5.0" 1314 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1315 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1316 | dependencies: 1317 | has-flag "^3.0.0" 1318 | 1319 | table@^5.2.3: 1320 | version "5.4.6" 1321 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" 1322 | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 1323 | dependencies: 1324 | ajv "^6.10.2" 1325 | lodash "^4.17.14" 1326 | slice-ansi "^2.1.0" 1327 | string-width "^3.0.0" 1328 | 1329 | text-table@^0.2.0: 1330 | version "0.2.0" 1331 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1332 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1333 | 1334 | to-regex-range@^5.0.1: 1335 | version "5.0.1" 1336 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1337 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1338 | dependencies: 1339 | is-number "^7.0.0" 1340 | 1341 | ts-node@^8.10.2: 1342 | version "8.10.2" 1343 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" 1344 | integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== 1345 | dependencies: 1346 | arg "^4.1.0" 1347 | diff "^4.0.1" 1348 | make-error "^1.1.1" 1349 | source-map-support "^0.5.17" 1350 | yn "3.1.1" 1351 | 1352 | tslib@^1.8.1: 1353 | version "1.13.0" 1354 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 1355 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 1356 | 1357 | tsutils@^3.17.1: 1358 | version "3.17.1" 1359 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" 1360 | integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== 1361 | dependencies: 1362 | tslib "^1.8.1" 1363 | 1364 | type-check@^0.4.0, type-check@~0.4.0: 1365 | version "0.4.0" 1366 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1367 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1368 | dependencies: 1369 | prelude-ls "^1.2.1" 1370 | 1371 | type-detect@^4.0.0, type-detect@^4.0.5: 1372 | version "4.0.8" 1373 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1374 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1375 | 1376 | type-fest@^0.8.1: 1377 | version "0.8.1" 1378 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1379 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1380 | 1381 | typescript@^3.9.7: 1382 | version "3.9.7" 1383 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" 1384 | integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== 1385 | 1386 | uri-js@^4.2.2: 1387 | version "4.2.2" 1388 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1389 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1390 | dependencies: 1391 | punycode "^2.1.0" 1392 | 1393 | v8-compile-cache@^2.0.3: 1394 | version "2.1.1" 1395 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" 1396 | integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== 1397 | 1398 | which-module@^2.0.0: 1399 | version "2.0.0" 1400 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1401 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1402 | 1403 | which@2.0.2, which@^2.0.1: 1404 | version "2.0.2" 1405 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1406 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1407 | dependencies: 1408 | isexe "^2.0.0" 1409 | 1410 | wide-align@1.1.3: 1411 | version "1.1.3" 1412 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1413 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1414 | dependencies: 1415 | string-width "^1.0.2 || 2" 1416 | 1417 | word-wrap@^1.2.3: 1418 | version "1.2.3" 1419 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1420 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1421 | 1422 | workerpool@6.0.0: 1423 | version "6.0.0" 1424 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.0.tgz#85aad67fa1a2c8ef9386a1b43539900f61d03d58" 1425 | integrity sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA== 1426 | 1427 | wrap-ansi@^5.1.0: 1428 | version "5.1.0" 1429 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 1430 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 1431 | dependencies: 1432 | ansi-styles "^3.2.0" 1433 | string-width "^3.0.0" 1434 | strip-ansi "^5.0.0" 1435 | 1436 | wrappy@1: 1437 | version "1.0.2" 1438 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1439 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1440 | 1441 | write@1.0.3: 1442 | version "1.0.3" 1443 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 1444 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 1445 | dependencies: 1446 | mkdirp "^0.5.1" 1447 | 1448 | y18n@^4.0.0: 1449 | version "4.0.0" 1450 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 1451 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 1452 | 1453 | yargs-parser@13.1.2, yargs-parser@^13.1.2: 1454 | version "13.1.2" 1455 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 1456 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 1457 | dependencies: 1458 | camelcase "^5.0.0" 1459 | decamelize "^1.2.0" 1460 | 1461 | yargs-parser@^15.0.1: 1462 | version "15.0.1" 1463 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" 1464 | integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== 1465 | dependencies: 1466 | camelcase "^5.0.0" 1467 | decamelize "^1.2.0" 1468 | 1469 | yargs-unparser@1.6.1: 1470 | version "1.6.1" 1471 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.1.tgz#bd4b0ee05b4c94d058929c32cb09e3fce71d3c5f" 1472 | integrity sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA== 1473 | dependencies: 1474 | camelcase "^5.3.1" 1475 | decamelize "^1.2.0" 1476 | flat "^4.1.0" 1477 | is-plain-obj "^1.1.0" 1478 | yargs "^14.2.3" 1479 | 1480 | yargs@13.3.2: 1481 | version "13.3.2" 1482 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 1483 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 1484 | dependencies: 1485 | cliui "^5.0.0" 1486 | find-up "^3.0.0" 1487 | get-caller-file "^2.0.1" 1488 | require-directory "^2.1.1" 1489 | require-main-filename "^2.0.0" 1490 | set-blocking "^2.0.0" 1491 | string-width "^3.0.0" 1492 | which-module "^2.0.0" 1493 | y18n "^4.0.0" 1494 | yargs-parser "^13.1.2" 1495 | 1496 | yargs@^14.2.3: 1497 | version "14.2.3" 1498 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" 1499 | integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== 1500 | dependencies: 1501 | cliui "^5.0.0" 1502 | decamelize "^1.2.0" 1503 | find-up "^3.0.0" 1504 | get-caller-file "^2.0.1" 1505 | require-directory "^2.1.1" 1506 | require-main-filename "^2.0.0" 1507 | set-blocking "^2.0.0" 1508 | string-width "^3.0.0" 1509 | which-module "^2.0.0" 1510 | y18n "^4.0.0" 1511 | yargs-parser "^15.0.1" 1512 | 1513 | yn@3.1.1: 1514 | version "3.1.1" 1515 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1516 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1517 | --------------------------------------------------------------------------------