├── .gitattributes ├── .gitignore ├── .gitlab-ci.yml ├── .vscode └── settings.json ├── Changes.md ├── LICENSE ├── Readme.md ├── package.json ├── src ├── StateMachine.ts ├── index.ts └── tsconfig.json ├── test ├── StateMachine.ts ├── karma.conf.js ├── tsconfig.json └── webpack.config.js ├── tsconfig.json ├── webpack.config.js └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | * text eol=lf 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | node_modules 3 | lib 4 | .npmrc 5 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | image: beneaththeink/node-xvfb 2 | 3 | stages: 4 | - test 5 | 6 | job1: 7 | stage: test 8 | script: 9 | - npm run setup 10 | - npm run test 11 | only: 12 | - branches 13 | tags: 14 | - nerv-aws-docker-linux 15 | 16 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib" 3 | } -------------------------------------------------------------------------------- /Changes.md: -------------------------------------------------------------------------------- 1 | # v1.1.0 2 | * Fixed "Recusrive type is too deep and possibly infinite errors." This error existed in Typescript 4.1.5 and earlier, but was harder to trigger, requiring large complex state machines. Typescript 4.2.3 caused this to happen for smaller state machines. The root problem is that type multimaps expressed using index types required nested conditionals. To fix this, we now use use unions of key/value pair tuples to express the type map primitive. This allows us to build the map without conditionals and merely needs conditionals for lookups (which aren't in the "critical path" of the type builder). 3 | * We now use mapped type literals (e.g. ```ErrorBrand<`${S} is not a state`>```) in our errors to give you very direct and clear error messages as to the exact type causing the error. 4 | * The typemap changes caused a type widening issue in inferring the state return value of action handlers. You now need to put `as const` after all your returned states. See `Readme.md` example. This may be a breaking change if you weren't doing this before, but will be compatible if we're able to remove this restriction in the future. 5 | 6 | # v1.0.6 7 | * Fixed Webpack issues that made v1.0.0 unusable. 8 | * Added tests, including compile-time tests that assert you indeed get compilation failures for illegal uses. `// @ts-expect-error` is very handy for testing complex types. 9 | 10 | # v1.0.0 11 | * Major rewrite of ts-checked-fsm. Removed `validateState` callback and `ValidatedState` vs `UnvalidatedState` type, which was a cool proof of concept but a really annoying API. 12 | * Introduced actions and action handlers into builder pattern. The final product of the `stateMachine` builder is now simply a `nextState` function. Call it with the current state and an action and it returns the state resulting from the appropriate action handler. 13 | 14 | # v0.3.0 15 | * Initial public release of `ts-checked-fsm`. 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 Tableau Software, Inc. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # ts-checked-fsm 2 | 3 | ![Community Supported](https://img.shields.io/badge/Support%20Level-Community%20Supported-457387.svg) 4 | 5 | ts-checked-fsm provides compile tile validation of state machine transitions leveraging Typescript's powerful type system. 6 | 7 | * [Overview](#overview) 8 | * [Example](#example) 9 | * [Notes](#notes) 10 | * [Get Started](#get-started) 11 | * [Requirements](#requirements) 12 | * [Installation](#installation) 13 | * [Building](#building) 14 | * [Contributions](#contributions) 15 | 16 | # Overview 17 | This library provides a builder pattern API for you declare a finite state machine as a set of states, actions, and transitions, and action handlers. The API is somewhat comparable to other state machine libraries, like XState with one major difference: ts-checked-fsm validates that your state machine is internally consistent and will fail compilation if not. 18 | 19 | Examples of things that fail to compile: 20 | * You declare transitions between non-existent states 21 | * You declare the same state more than once 22 | * You declare a handler for the same state and action more than once 23 | * You declare a handler for a state or action that doesn't exist 24 | * A handler returns type that doesn't match a declared state 25 | * A handler for state c returns a state n for which there is no transition from c to n 26 | * You forget a handler for a any non-terminal state 27 | 28 | The library uses Error branding and intentionally causes failed type assignments to give you quasi-human-readable error messages. There is a ton of type system devil-magic going on here to make all of this happen. 29 | 30 | ## Example 31 | ```ts 32 | type MoneyPayload = { 33 | moneyInserted: number, 34 | }; 35 | 36 | type ChangePayload = { 37 | changeRemaining: number, 38 | }; 39 | 40 | type InsertMoneyActionPayload = { 41 | money: number, 42 | }; 43 | 44 | const { nextState } = stateMachine() 45 | .state('idle') 46 | .state<'get-money', MoneyPayload>('get-money') 47 | .state<'vend', ChangePayload>('vend') 48 | .state<'dispense-change', ChangePayload>('dispense-change') 49 | .transition('idle', 'get-money') 50 | .transition('get-money', 'get-money') 51 | .transition('get-money', 'vend') 52 | .transition('vend', 'dispense-change') 53 | .transition('dispense-change', 'dispense-change') 54 | .transition('dispense-change', 'idle') 55 | .action<'insert-money', InsertMoneyActionPayload>('insert-money') 56 | .action<'vend-soda'>('vend-soda') 57 | .action<'clock-tick'>('clock-tick') 58 | .actionHandler('idle', 'insert-money', (_c, a) => { 59 | return { 60 | stateName: 'get-money', 61 | moneyInserted: a.money, 62 | } as const; 63 | }) 64 | .actionHandler('get-money', 'insert-money', (c, a) => { 65 | return { 66 | stateName: 'get-money', 67 | moneyInserted: c.moneyInserted + a.money 68 | } as const; 69 | }) 70 | .actionHandler('get-money', 'vend-soda', (c, _a) => { 71 | return c.moneyInserted >= 50 ? { 72 | stateName: 'vend', 73 | changeRemaining: c.moneyInserted - 50 74 | } as const : c; 75 | }) 76 | .actionHandler('vend', 'clock-tick', (c, _a) => { 77 | return { 78 | stateName: 'dispense-change', 79 | changeRemaining: c.changeRemaining 80 | } as const; 81 | }) 82 | .actionHandler('dispense-change', 'clock-tick', (c, _a) => { 83 | const coinVal = c.changeRemaining >= 25 84 | ? 25 85 | : c.changeRemaining >= 10 86 | ? 10 87 | : c.changeRemaining >= 5 88 | ? 5 89 | : 1; 90 | 91 | return c.changeRemaining - coinVal > 0 ? { 92 | stateName: 'dispense-change', 93 | changeRemaining: c.changeRemaining - coinVal 94 | } as const : { 95 | stateName: 'idle' 96 | } as const; 97 | }) 98 | .done(); 99 | 100 | let n = nextState({stateName: 'idle'}, { actionName: 'clock-tick'}); 101 | // Idle state doesn't repsond to clock-tick, so state is unchanged 102 | expect(n).toEqual({stateName: 'idle'}); 103 | n = nextState({stateName: 'idle'}, { actionName: 'insert-money', money: 25}) 104 | expect(n).toEqual({stateName: 'get-money', moneyInserted: 25}); 105 | n = nextState(n, { actionName: 'insert-money', money: 25}); 106 | expect(n).toEqual({stateName: 'get-money', moneyInserted: 50}); 107 | n = nextState(n, { actionName: 'insert-money', money: 27}); 108 | expect(n).toEqual({stateName: 'get-money', moneyInserted: 77}); 109 | n = nextState(n, { actionName: 'vend-soda'}); 110 | expect(n).toEqual({stateName: 'vend', changeRemaining: 27}); 111 | n = nextState(n, { actionName: 'clock-tick'}); 112 | expect(n).toEqual({stateName: 'dispense-change', changeRemaining: 27}); 113 | n = nextState(n, { actionName: 'clock-tick'}); 114 | expect(n).toEqual({stateName: 'dispense-change', changeRemaining: 2}); 115 | n = nextState(n, { actionName: 'clock-tick'}); 116 | expect(n).toEqual({stateName: 'dispense-change', changeRemaining: 1}); 117 | n = nextState(n, { actionName: 'clock-tick'}); 118 | expect(n).toEqual({stateName: 'idle'}); 119 | ``` 120 | 121 | ## Notes 122 | * Self transition are not implicit. You must explicitly declare them if a handler for state `x` is allowed to return state `x`. 123 | * You don't have to declare handlers for final states (i.e. those that have no transitions out of them). If fact, it's illegal to do so since they have no valid transitions out of them! 124 | * As shown in the example, states and actions can have a payload. 125 | * For handlers that can return multiple state types depending on some condition, every state must be a legal transition. 126 | 127 | ## How it works 128 | This library uses clever constructions using Typescript's type system. More details in this blog [post](https://engineering.tableau.com/really-advanced-typescript-types-c590eee59a12). 129 | 130 | # Get started 131 | 132 | ## Requirements: 133 | Typescript 4.0+ or equivalent bundler loader (e.g. ts-loader for webpack). 134 | 135 | ## Installation 136 | Add ts-checked-fsm as a dependency in your package.json. 137 | 138 | ## Building 139 | 140 | ### Setup 141 | Before any of the following tasks, you need to install dependencies: 142 | ``` 143 | yarn install 144 | ``` 145 | 146 | While untested, you can probably substitute npm for yarn and things will probably work. 147 | 148 | ### Compilation 149 | ``` 150 | yarn run build 151 | ``` 152 | 153 | Output appears in lib folder 154 | 155 | # Contributions 156 | Code contributions and improvements by the community are welcomed! 157 | See the LICENSE file for current open-source licensing and use information. 158 | 159 | Before we can accept pull requests from contributors, we require a signed [Contributor License Agreement (CLA)](http://tableau.github.io/contributing.html), 160 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-checked-fsm", 3 | "version": "1.1.0", 4 | "description": "A typescript library for defining state machine types with compile-time transition validation. Types are fun.", 5 | "main": "index.js", 6 | "typings": "types/index.d.ts", 7 | "scripts": { 8 | "setup": "yarn install", 9 | "build": "webpack --config webpack.config.js", 10 | "test": "karma start test/karma.conf.js --single-run", 11 | "testWatch": "karma start test/karma.conf.js" 12 | }, 13 | "author": "Rick Weber", 14 | "license": "ISC", 15 | "devDependencies": { 16 | "@types/jasmine": "4.0.3", 17 | "@types/karma": "6.3.3", 18 | "copy-pkg-json-webpack-plugin": "0.0.40", 19 | "karma": "6.4.0", 20 | "karma-chrome-launcher": "3.1.1", 21 | "karma-jasmine": "5.1.0", 22 | "karma-webpack": "5.0.0", 23 | "ts-loader": "9.3.1", 24 | "typescript": "4.7.4", 25 | "webpack": "5.73.0", 26 | "webpack-cli": "4.10.0" 27 | }, 28 | "peerDependencies": { 29 | "redux": ">=3.5.0", 30 | "redux-saga": ">=0.16.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/StateMachine.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * State labels can be strings 3 | */ 4 | type StateType = IndexType; 5 | 6 | /** 7 | * Action labels can be strings 8 | */ 9 | export type ActionNameType = IndexType; 10 | 11 | /** 12 | * Represents a state and data and its corresponding data. 13 | */ 14 | export type State = Readonly & { 15 | readonly stateName: S; 16 | } 17 | 18 | /** 19 | * Give Actions to nextState() to (maybe) trigger a transition. 20 | */ 21 | export type Action = Readonly & { 22 | readonly actionName: Name 23 | }; 24 | 25 | /// 26 | /// Errors 27 | /// 28 | 29 | /** 30 | * Represents a compiler error message. Error brands prevent really clever users from naming their states as one of the error messages 31 | * and subverting error checking. Yet, the compiler still displays the string at the end of the failed cast indicating what the 32 | * issue is rather than something puzzling like could not assign to never. 33 | */ 34 | type ErrorBrand = { [k in T]: void }; 35 | 36 | type IndexType = string | number; 37 | 38 | /// Validators 39 | type AssertStateInMap = S extends MapKeys ? S : ErrorBrand<`'${S}' is not a state`>; 40 | type AssertNewState = S extends MapKeys ? ErrorBrand<`'${S}' has already been declared`> : S; 41 | type AssertNewTransition = N extends MapLookup ? ErrorBrand<`There already exists a transition from '${S}' to '${N}'`> : N; 42 | type AssertActionNotDefined = AN extends ActionNames ? ErrorBrand<`Action '${AN}' already declared`> : AN; 43 | type AssertActionIsDefined = AN extends ActionNames ? AN : ErrorBrand<`'${AN}' is not an action`>; 44 | type AssertAllNonTerminalStatesHandled = 45 | MapKeys extends HandledStates ? void : ErrorBrand<`No handlers declared for ${Exclude, HandledStates>}`>; 46 | 47 | type StateMachineDefinition = { 48 | handlers: { 49 | [s: string]: { 50 | [a: string]: (cur: MapValues, action: MapValues) => MapValues 51 | } 52 | } 53 | }; 54 | 55 | // Allows us to append multiple values for the same key in a type map. 56 | type AddToTypeMap = 57 | M | [K , V]; 58 | 59 | type MapLookup = Map extends [K, infer V] ? V : never; 60 | type MapKeys = Map extends [infer K, infer _] ? K extends IndexType ? K : never : never; 61 | type MapValues = Map extends [infer _, infer V] ? V : never; 62 | 63 | /// 64 | /// stateMachine() builder 65 | /// 66 | 67 | /** 68 | * A builder from calling stateMachine(). 69 | */ 70 | export type StateMachineBuilder = { 71 | /** 72 | * Add a state to this state machine. 73 | */ 74 | readonly state: StateFunc; 75 | } 76 | 77 | type StateMachineFunc = () => StateMachineBuilder; 78 | 79 | /// 80 | /// .state() builder 81 | /// 82 | 83 | /** 84 | * A builder from calling .state() 85 | */ 86 | export type StateBuilder = { 87 | /** 88 | * Add a state to this state machine. 89 | */ 90 | readonly state: StateFunc; 91 | 92 | readonly transition: TransitionFunc; 93 | } 94 | 95 | /** 96 | * The signature for calling the state function in the builder. 97 | */ 98 | type StateFunc = ( 99 | state: AssertNewState 100 | ) => StateBuilder>>; 101 | 102 | /// 103 | /// .transition() builder 104 | /// 105 | 106 | /** 107 | * The builder returned by .transition() 108 | */ 109 | export type TransitionBuilder = { 110 | /** 111 | * Add a transition to this state machine. 112 | */ 113 | readonly transition: TransitionFunc; 114 | 115 | readonly action: ActionFunc; 116 | } 117 | 118 | /** 119 | * The signature of .transition() 120 | */ 121 | export type TransitionFunc = ( 122 | curState: AssertStateInMap, 123 | nextState: N extends MapKeys ? AssertNewTransition : ErrorBrand<`${S} is not a declared state`> 124 | ) => TransitionBuilder>; 125 | 126 | /// 127 | /// .action() builder 128 | /// 129 | 130 | export type ActionBuilder< 131 | StateMap, 132 | Transitions, 133 | ActionsMap 134 | > = { 135 | readonly action: ActionFunc; 136 | 137 | readonly actionHandler: ActionHandlerFunc< 138 | StateMap, 139 | Transitions, 140 | ActionsMap, 141 | never 142 | >; 143 | }; 144 | 145 | export type ActionFunc< 146 | StateMap, 147 | Transitions, 148 | ActionsMap 149 | > = (actionName: AssertActionNotDefined>) => ActionBuilder>>; 150 | 151 | /// 152 | /// .actionsHandler() builder. 153 | /// 154 | 155 | /** 156 | * The builder returned by .actionHandler() 157 | */ 158 | export type ActionHandlersBuilder = { 159 | readonly actionHandler: ActionHandlerFunc; 160 | 161 | readonly done: DoneFunc, 162 | } 163 | 164 | /** 165 | * The Signature of .actionHandler(). 166 | */ 167 | export type ActionHandlerFunc< 168 | StateMap, 169 | Transitions, 170 | ActionMap, 171 | HandledStates 172 | > = < 173 | S extends StateType, 174 | AN extends ActionNameType, 175 | NS extends MapValues, 176 | > ( 177 | // TODO: Checking that the action and state pair haven't already been declared here causes 178 | state: AssertStateInMap, 179 | action: AssertActionIsDefined>, 180 | handler: ActionHandlerCallback 181 | ) => ActionHandlersBuilder; 182 | 183 | type ActionHandlerCallback< 184 | States, 185 | Transitions, 186 | CS extends StateType, 187 | AN extends ActionNameType, 188 | NS extends MapValues, 189 | Actions, 190 | > = (state: MapLookup, action: MapLookup) => 191 | NS extends State 192 | ? N extends MapKeys 193 | ? CS extends MapKeys 194 | ? N extends MapLookup 195 | ? State 196 | : ErrorBrand<`No transition declared between ${CS} and ${N}`> 197 | : ErrorBrand<`State ${CS} is terminal and has no transitions`> 198 | : ErrorBrand<`${N} is not a state`> 199 | : ErrorBrand<'The returned value is not a state'>; 200 | 201 | /// 202 | /// .done() 203 | /// 204 | type DoneBuilder = (definition: StateMachineDefinition) => DoneFunc; 205 | 206 | // Check that the only unhandled states in the handler map are final states (i.e, they have no transitions out of them) 207 | type DoneFunc = 208 | (_: AssertAllNonTerminalStatesHandled) => StateMachine; 209 | 210 | /** 211 | * A state machine 212 | */ 213 | export type StateMachine = { 214 | nextState: (curState: MapValues, action: MapValues) => MapValues, 215 | }; 216 | 217 | export const stateMachine: StateMachineFunc = (): StateMachineBuilder => { 218 | const stateFunc = state(); 219 | 220 | return { 221 | state: stateFunc, 222 | }; 223 | } 224 | 225 | const state = (): StateFunc => { 226 | return (_s: AssertNewState) => { 227 | type NewStateMap = AddToTypeMap>; 228 | 229 | const transitionFunc = transition(); 230 | const stateFunc = state() 231 | 232 | const builder = { 233 | state: stateFunc, 234 | transition: transitionFunc, 235 | }; 236 | 237 | return builder; 238 | } 239 | } 240 | 241 | const transition = (): TransitionFunc => { 242 | return ( 243 | _curState: AssertStateInMap, 244 | _next: N extends MapKeys ? AssertNewTransition : ErrorBrand<`${S} is not a declared state`> 245 | ) => { 246 | type NewTransitions = AddToTypeMap; 247 | 248 | const transitionFunction = transition(); 249 | const actionFunc = action(); 250 | 251 | return { 252 | transition: transitionFunction, 253 | action: actionFunc, 254 | }; 255 | }; 256 | } 257 | 258 | const action = (): ActionFunc => { 259 | return (_actionName: AssertActionNotDefined>) => { 260 | type NewActionMap = AddToTypeMap>; 261 | 262 | const actionFunc: any = action() 263 | const actionHandlerFunc = actionHandler({ handlers: {}}); 264 | 265 | return { 266 | action: actionFunc, 267 | actionHandler: actionHandlerFunc, 268 | }; 269 | } 270 | } 271 | 272 | const actionHandler = (definition: StateMachineDefinition): ActionHandlerFunc => { 273 | return >( 274 | state: AssertStateInMap, 275 | action: AssertActionIsDefined>, 276 | handler: ActionHandlerCallback 277 | ) => { 278 | const untypedState = state as unknown as S; 279 | const untypedAction = action as unknown as AN; 280 | const newDefinition: StateMachineDefinition = { 281 | ...definition, 282 | handlers: { 283 | ...definition.handlers, 284 | [untypedState]: { 285 | ...definition.handlers[untypedState] ? definition.handlers[untypedState] : {}, 286 | [untypedAction]: handler as any, 287 | } 288 | } 289 | }; 290 | 291 | type NextHandledStates = HandledStates | S; 292 | 293 | const doneFunc = done(newDefinition); 294 | const actionHandlerFunc = actionHandler(newDefinition); 295 | 296 | return { 297 | actionHandler: actionHandlerFunc, 298 | done: doneFunc 299 | }; 300 | }; 301 | }; 302 | 303 | const done: DoneBuilder = (definition: StateMachineDefinition) => { 304 | const doneFunc: DoneFunc = ( 305 | _: AssertAllNonTerminalStatesHandled 306 | ): StateMachine => { 307 | const nextStateFunction = (curState: MapValues, action: MapValues): MapValues => { 308 | const curStateAsState = curState as unknown as State; 309 | const actionAsAction = action as unknown as Action; 310 | 311 | // If no handler declared for state, state doesn't change. 312 | if (definition.handlers[curStateAsState.stateName] == null) { 313 | return curState; 314 | } 315 | 316 | // If no handler declared for action in given state, state doesn't change. 317 | return definition.handlers[curStateAsState.stateName][actionAsAction.actionName] != null 318 | ? definition.handlers[curStateAsState.stateName][actionAsAction.actionName](curState, action) 319 | : curState; 320 | }; 321 | 322 | return { 323 | nextState: nextStateFunction 324 | }; 325 | } 326 | 327 | return doneFunc 328 | } 329 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | State, 3 | Action, 4 | stateMachine, 5 | StateMachine, 6 | } from './StateMachine'; -------------------------------------------------------------------------------- /src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "declaration": true, 5 | "sourceMap": true, 6 | "strict": true, 7 | "strictNullChecks": true, 8 | "moduleResolution": "node", 9 | "noUnusedLocals": true, 10 | "noUnusedParameters": true, 11 | "noImplicitReturns": true, 12 | "declarationDir": "../lib/types" 13 | }, 14 | "files": [ 15 | "index.ts" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /test/StateMachine.ts: -------------------------------------------------------------------------------- 1 | import { stateMachine } from '../src/StateMachine'; 2 | 3 | describe('state machine', () => { 4 | it('transitions on action that causes transition', () => { 5 | const { nextState } = stateMachine() 6 | .state('a') 7 | .state('b') 8 | .transition('a', 'b') 9 | .action('a1') 10 | .actionHandler('a', 'a1', (_c, _) => { 11 | return { 12 | stateName: 'b', 13 | } as const; 14 | }) 15 | .done(); 16 | 17 | const t1 = nextState({stateName: 'a'}, {actionName: 'a1'}); 18 | expect(t1.stateName).toBe('b'); 19 | const t2 = nextState(t1, {actionName: 'a1'}); 20 | expect(t2.stateName).toBe('b'); 21 | }); 22 | 23 | it('does not transition on action that does not cause transition', () => { 24 | const { nextState } = stateMachine() 25 | .state('a') 26 | .state('b') 27 | .transition('a', 'b') 28 | .action('a1') 29 | .action('a2') 30 | .actionHandler('a', 'a1', (_c, _) => { 31 | return { 32 | stateName: 'b' as const, 33 | }; 34 | }) 35 | .done(); 36 | 37 | const t1 = nextState({stateName: 'a'}, {actionName: 'a2'}); 38 | expect(t1.stateName).toBe('a'); 39 | }); 40 | 41 | it('does not transition on action that does not cause transition', () => { 42 | type Payload = { count: number }; 43 | 44 | const { nextState } = stateMachine() 45 | .state<'a', Payload>('a') 46 | .state<'b', Payload>('b') 47 | .transition('a', 'b') 48 | .action('a1') 49 | .action('a2') 50 | .actionHandler('a', 'a1', (_c, _) => { 51 | return { 52 | stateName: 'b' as const, 53 | count: 7, 54 | }; 55 | }) 56 | .done(); 57 | 58 | const t1 = nextState({stateName: 'a', count: 8}, {actionName: 'a2'}); 59 | expect(t1.stateName).toBe('a'); 60 | }); 61 | 62 | it ('Works for a somewhat interesting scenario', () => { 63 | type MoneyPayload = { 64 | moneyInserted: number, 65 | }; 66 | 67 | type ChangePayload = { 68 | changeRemaining: number, 69 | }; 70 | 71 | type InsertMoneyActionPayload = { 72 | money: number, 73 | }; 74 | 75 | const { nextState } = stateMachine() 76 | .state('idle') 77 | .state<'get-money', MoneyPayload>('get-money') 78 | .state<'vend', ChangePayload>('vend') 79 | .state<'dispense-change', ChangePayload>('dispense-change') 80 | .transition('idle', 'get-money') 81 | .transition('get-money', 'get-money') 82 | .transition('get-money', 'vend') 83 | .transition('vend', 'dispense-change') 84 | .transition('dispense-change', 'dispense-change') 85 | .transition('dispense-change', 'idle') 86 | .action<'insert-money', InsertMoneyActionPayload>('insert-money') 87 | .action<'vend-soda'>('vend-soda') 88 | .action<'clock-tick'>('clock-tick') 89 | .actionHandler('idle', 'insert-money', (_c, a) => { 90 | return { 91 | stateName: 'get-money' as const, 92 | moneyInserted: a.money, 93 | }; 94 | }) 95 | .actionHandler('get-money', 'insert-money', (c, a) => { 96 | return { 97 | stateName: 'get-money' as const, 98 | moneyInserted: c.moneyInserted + a.money 99 | }; 100 | }) 101 | .actionHandler('get-money', 'vend-soda', (c, _a) => { 102 | return c.moneyInserted >= 50 ? { 103 | stateName: 'vend' as const, 104 | changeRemaining: c.moneyInserted - 50 105 | } : c; 106 | }) 107 | .actionHandler('vend', 'clock-tick', (c, _a) => { 108 | return { 109 | stateName: 'dispense-change' as const, 110 | changeRemaining: c.changeRemaining 111 | }; 112 | }) 113 | .actionHandler('dispense-change', 'clock-tick', (c, _a) => { 114 | const coinVal = c.changeRemaining >= 25 115 | ? 25 116 | : c.changeRemaining >= 10 117 | ? 10 118 | : c.changeRemaining >= 5 119 | ? 5 120 | : 1; 121 | 122 | return c.changeRemaining - coinVal > 0 ? { 123 | stateName: 'dispense-change' as const, 124 | changeRemaining: c.changeRemaining - coinVal 125 | } : { 126 | stateName: 'idle' as const 127 | }; 128 | }) 129 | .done(); 130 | 131 | let n = nextState({stateName: 'idle'}, { actionName: 'clock-tick'}); 132 | // Idle state doesn't repsond to clock-tick, so state is unchanged 133 | expect(n).toEqual({stateName: 'idle'}); 134 | n = nextState({stateName: 'idle'}, { actionName: 'insert-money', money: 25}) 135 | expect(n).toEqual({stateName: 'get-money', moneyInserted: 25}); 136 | n = nextState(n, { actionName: 'insert-money', money: 25}); 137 | expect(n).toEqual({stateName: 'get-money', moneyInserted: 50}); 138 | n = nextState(n, { actionName: 'insert-money', money: 27}); 139 | expect(n).toEqual({stateName: 'get-money', moneyInserted: 77}); 140 | n = nextState(n, { actionName: 'vend-soda'}); 141 | expect(n).toEqual({stateName: 'vend', changeRemaining: 27}); 142 | n = nextState(n, { actionName: 'clock-tick'}); 143 | expect(n).toEqual({stateName: 'dispense-change', changeRemaining: 27}); 144 | n = nextState(n, { actionName: 'clock-tick'}); 145 | expect(n).toEqual({stateName: 'dispense-change', changeRemaining: 2}); 146 | n = nextState(n, { actionName: 'clock-tick'}); 147 | expect(n).toEqual({stateName: 'dispense-change', changeRemaining: 1}); 148 | n = nextState(n, { actionName: 'clock-tick'}); 149 | expect(n).toEqual({stateName: 'idle'}); 150 | }) 151 | }) 152 | 153 | describe('compile-time checking', () => { 154 | it('should fail when specifying same state twice', () => { 155 | stateMachine() 156 | .state<'b'>('b') 157 | .state<'b'>( 158 | // @ts-expect-error 159 | 'b' 160 | ); 161 | }); 162 | 163 | it('should fail when specifying same state twice, different payload', () => { 164 | type Payload = { count: number }; 165 | 166 | stateMachine() 167 | .state<'b'>('b') 168 | .state<'b', Payload>( 169 | // @ts-expect-error 170 | 'b' 171 | ); 172 | }); 173 | 174 | it('should fail when specifying the same transition twice', () => { 175 | stateMachine() 176 | .state<'a'>('a') 177 | .state<'b'>('b') 178 | .transition('a', 'b') 179 | .transition( 180 | 'a', 181 | // @ts-expect-error 182 | 'b' 183 | ); 184 | }); 185 | 186 | it('should fail when declaring transition from non-state', () => { 187 | stateMachine() 188 | .state<'a'>('a') 189 | .state<'b'>('b') 190 | .transition( 191 | // @ts-expect-error 192 | 'c', 193 | 'b' 194 | ); 195 | }); 196 | 197 | it('should fail when declaring transition to non-state', () => { 198 | stateMachine() 199 | .state<'a'>('a') 200 | .state<'b'>('b') 201 | .transition( 202 | 'a', 203 | // @ts-expect-error 204 | 'c' 205 | ); 206 | }); 207 | 208 | it('should fail when declaring same action more than once', () => { 209 | stateMachine() 210 | .state<'a'>('a') 211 | .state<'b'>('b') 212 | .transition('a', 'b') 213 | .action('a1') 214 | .action( 215 | // @ts-expect-error 216 | 'a1' 217 | ); 218 | }); 219 | 220 | it('should fail when declaring same action more than once', () => { 221 | stateMachine() 222 | .state<'a'>('a') 223 | .state<'b'>('b') 224 | .transition('a', 'b') 225 | .action('a1') 226 | .action( 227 | // @ts-expect-error 228 | 'a1' 229 | ); 230 | }); 231 | 232 | it('should fail when declaring handler to non-state', () => { 233 | stateMachine() 234 | .state<'a'>('a') 235 | .state<'b'>('b') 236 | .transition('a', 'b') 237 | .action('a1') 238 | .actionHandler( 239 | // @ts-expect-error 240 | 'c', 241 | 'a1', 242 | () => { 243 | return { 244 | stateName: 'b' as const 245 | }; 246 | } 247 | ); 248 | }); 249 | 250 | it('should fail when declaring handler to non-action', () => { 251 | stateMachine() 252 | .state<'a'>('a') 253 | .state<'b'>('b') 254 | .transition('a', 'b') 255 | .action('a1') 256 | .actionHandler( 257 | 'a', 258 | // @ts-expect-error 259 | 'a2', 260 | () => { 261 | return { 262 | stateName: 'b' as const 263 | }; 264 | } 265 | ); 266 | }); 267 | 268 | it('should fail when declaring handler that transitions to non-state', () => { 269 | stateMachine() 270 | .state<'a'>('a') 271 | .state<'b'>('b') 272 | .transition('a', 'b') 273 | .action('a1') 274 | .actionHandler( 275 | 'a', 276 | 'a1', 277 | // @ts-expect-error 278 | () => { 279 | return { 280 | stateName: 'c' as const 281 | }; 282 | } 283 | ); 284 | }); 285 | 286 | it('should fail when declaring handler that makes undeclared transition to legal state', () => { 287 | stateMachine() 288 | .state<'a'>('a') 289 | .state<'b'>('b') 290 | .state<'c'>('c') 291 | .transition('a', 'b') 292 | .action('a1') 293 | .actionHandler( 294 | 'a', 295 | 'a1', 296 | // @ts-expect-error 297 | () => { 298 | return { 299 | stateName: 'c' as const 300 | }; 301 | } 302 | ); 303 | }); 304 | 305 | it('should succeed when declaring handler that makes declared transition to legal state', () => { 306 | stateMachine() 307 | .state<'a'>('a') 308 | .state<'b'>('b') 309 | .state<'c'>('c') 310 | .transition('a', 'b') 311 | .action('a1') 312 | .actionHandler('a', 'a1', () => { 313 | return { 314 | stateName: 'b' as const 315 | }; 316 | }); 317 | }); 318 | 319 | it('should succeed when declaring handler that makes declared transitions to more than one legal state', () => { 320 | stateMachine() 321 | .state<'a'>('a') 322 | .state<'b'>('b') 323 | .transition('a', 'b') 324 | .transition('a', 'a') 325 | .action('a1') 326 | .actionHandler('a', 'a1', (_c, _a) => { 327 | return Math.random () > 0.5 ? { 328 | stateName: 'b' as const 329 | } : { 330 | stateName: 'a' as const 331 | }; 332 | }); 333 | }); 334 | 335 | it('should succeed when declaring handler that makes declared transitions to more than one legal state (with payload)', () => { 336 | type Payload1 = { foo: '7' }; 337 | type Payload2 = { bar: '8' }; 338 | 339 | stateMachine() 340 | .state<'a', Payload1>('a') 341 | .state<'b', Payload2>('b') 342 | .transition('a', 'b') 343 | .transition('a', 'a') 344 | .action('a1') 345 | .actionHandler('a', 'a1', (_c, _a) => { 346 | return Math.random () > 0.5 ? { 347 | stateName: 'b', 348 | bar: '8' 349 | } as const : { 350 | stateName: 'a', 351 | foo: '7' 352 | } as const; 353 | }); 354 | }); 355 | 356 | it('should fail when declaring handler that makes declared transitions to legal state, but bad payload', () => { 357 | type Payload1 = { foo: '7' }; 358 | type Payload2 = { bar: '8' }; 359 | 360 | stateMachine() 361 | .state<'a', Payload1>('a') 362 | .state<'b', Payload2>('b') 363 | .transition('a', 'b') 364 | .transition('a', 'a') 365 | .action('a1') 366 | .actionHandler( 367 | 'a', 368 | 'a1', 369 | // @ts-expect-error 370 | (_c, _a) => { 371 | return Math.random () > 0.5 ? { 372 | stateName: 'b' as const, 373 | bar: '8' as const 374 | } : { 375 | stateName: 'a' as const, 376 | foo: '9' as const 377 | }; 378 | } 379 | ); 380 | }); 381 | 382 | // TODO: Find a way to fix this without causing infinite type complaints 383 | it('should allow declaring handler for same state+action', () => { 384 | type Payload1 = { foo: '7' }; 385 | type Payload2 = { bar: '8' }; 386 | 387 | stateMachine() 388 | .state<'a', Payload1>('a') 389 | .state<'b', Payload2>('b') 390 | .transition('a', 'b') 391 | .transition('a', 'a') 392 | .action('a1') 393 | .actionHandler('a', 'a1', (_c, _a) => { 394 | return Math.random () > 0.5 ? { 395 | stateName: 'b', 396 | bar: '8' 397 | } as const : { 398 | stateName: 'a', 399 | foo: '7' 400 | } as const; 401 | }) 402 | .actionHandler('a', 'a1', (_c, _a) => { 403 | return Math.random () > 0.5 ? { 404 | stateName: 'b', 405 | bar: '8' 406 | } as const : { 407 | stateName: 'a', 408 | foo: '7' 409 | } as const; 410 | }); 411 | }); 412 | 413 | it('should allow declaring same handler different state', () => { 414 | type Payload1 = { foo: '7' }; 415 | type Payload2 = { bar: '8' }; 416 | 417 | stateMachine() 418 | .state<'a', Payload1>('a') 419 | .state<'b', Payload2>('b') 420 | .transition('a', 'b') 421 | .transition('a', 'a') 422 | .transition('b', 'b') 423 | .action('a1') 424 | .actionHandler('a', 'a1', (_c, _a) => { 425 | return Math.random () > 0.5 ? { 426 | stateName: 'b', 427 | bar: '8' 428 | } as const : { 429 | stateName: 'a', 430 | foo: '7' 431 | } as const; 432 | }) 433 | .actionHandler('b', 'a1', (_c, _a) => { 434 | return { 435 | stateName: 'b', 436 | bar: '8' 437 | } as const; 438 | }); 439 | }); 440 | 441 | it('should be able to read action payload', () => { 442 | type Payload1 = { foo: number }; 443 | type Payload2 = { bar: number }; 444 | type ActionPayload = { val: 8 }; 445 | 446 | stateMachine() 447 | .state<'a', Payload1>('a') 448 | .state<'b', Payload2>('b') 449 | .transition('a', 'b') 450 | .transition('a', 'a') 451 | .transition('b', 'b') 452 | .action<'a1', ActionPayload>('a1') 453 | .actionHandler('a', 'a1', (_c, a) => { 454 | return Math.random () > 0.5 ? { 455 | stateName: 'b', 456 | bar: a.val 457 | } as const : { 458 | stateName: 'a', 459 | foo: a.val 460 | } as const; 461 | }) 462 | .actionHandler('b', 'a1', (_c, a) => { 463 | return { 464 | stateName: 'b', 465 | bar: a.val + 7 466 | } as const; 467 | }); 468 | }); 469 | 470 | it('Should fail when missing handler for non-terminal state (self-transition)', () => { 471 | type Payload1 = { foo: '7' }; 472 | type Payload2 = { bar: '8' }; 473 | 474 | stateMachine() 475 | .state<'a', Payload1>('a') 476 | .state<'b', Payload2>('b') 477 | .transition('a', 'b') 478 | .transition('a', 'a') 479 | .transition('b', 'b') 480 | .action('a1') 481 | .actionHandler('a', 'a1', (_c, _a) => { 482 | return Math.random () > 0.5 ? { 483 | stateName: 'b', 484 | bar: '8' 485 | } as const : { 486 | stateName: 'a', 487 | foo: '7' 488 | } as const; 489 | }) 490 | // @ts-expect-error 491 | .done(); 492 | }); 493 | 494 | it('Should fail when missing handler for non-terminal state', () => { 495 | type Payload1 = { foo: '7' }; 496 | type Payload2 = { bar: '8' }; 497 | 498 | stateMachine() 499 | .state<'a', Payload1>('a') 500 | .state<'b', Payload2>('b') 501 | .state<'c', Payload2>('c') 502 | .transition('a', 'b') 503 | .transition('b', 'c') 504 | .action('a1') 505 | .actionHandler('a', 'a1', (_c, _a) => { 506 | return { 507 | stateName: 'b', 508 | bar: '8', 509 | } as const; 510 | }) 511 | // @ts-expect-error 512 | .done(); 513 | }); 514 | 515 | it('Should succed all non-terminal handlers are declared', () => { 516 | type Payload1 = { foo: '7' }; 517 | type Payload2 = { bar: '8' }; 518 | 519 | stateMachine() 520 | .state<'a', Payload1>('a') 521 | .state<'b', Payload2>('b') 522 | .state<'c', Payload2>('c') 523 | .transition('a', 'b') 524 | .transition('b', 'c') 525 | .action('a1') 526 | .actionHandler('a', 'a1', (_c, _a) => { 527 | return { 528 | stateName: 'b', 529 | bar: '8', 530 | } as const; 531 | }) 532 | .actionHandler('b', 'a1', (_c, _a) => { 533 | return { 534 | stateName: 'c', 535 | bar: '8', 536 | } as const; 537 | }) 538 | .done(); 539 | }); 540 | 541 | it('Should succeed when all handlers are declared (no terminal states)', () => { 542 | type Payload1 = { foo: '7' }; 543 | type Payload2 = { bar: '8' }; 544 | 545 | stateMachine() 546 | .state<'a', Payload1>('a') 547 | .state<'b', Payload2>('b') 548 | .state<'c', Payload2>('c') 549 | .transition('a', 'b') 550 | .transition('b', 'c') 551 | .transition('c', 'a') 552 | .action('a1') 553 | .actionHandler('a', 'a1', (_c, _a) => { 554 | return { 555 | stateName: 'b', 556 | bar: '8', 557 | } as const; 558 | }) 559 | .actionHandler('b', 'a1', (_c, _a) => { 560 | return { 561 | stateName: 'c', 562 | bar: '8', 563 | } as const 564 | }) 565 | .actionHandler('c', 'a1', (_c, _a) => { 566 | return { 567 | stateName: 'a', 568 | foo: '7', 569 | } as const; 570 | }) 571 | .done(); 572 | }); 573 | 574 | it('Should allow README.md example', () => { 575 | type MoneyPayload = { 576 | moneyInserted: number, 577 | }; 578 | 579 | type ChangePayload = { 580 | changeRemaining: number, 581 | }; 582 | 583 | type InsertMoneyActionPayload = { 584 | money: number, 585 | }; 586 | 587 | const { nextState } = stateMachine() 588 | .state('idle') 589 | .state<'get-money', MoneyPayload>('get-money') 590 | .state<'vend', ChangePayload>('vend') 591 | .state<'dispense-change', ChangePayload>('dispense-change') 592 | .transition('idle', 'get-money') 593 | .transition('get-money', 'get-money') 594 | .transition('get-money', 'vend') 595 | .transition('vend', 'dispense-change') 596 | .transition('dispense-change', 'dispense-change') 597 | .transition('dispense-change', 'idle') 598 | .action<'insert-money', InsertMoneyActionPayload>('insert-money') 599 | .action<'vend-soda'>('vend-soda') 600 | .action<'clock-tick'>('clock-tick') 601 | .actionHandler('idle', 'insert-money', (_c, a) => { 602 | return { 603 | stateName: 'get-money', 604 | moneyInserted: a.money, 605 | } as const; 606 | }) 607 | .actionHandler('get-money', 'insert-money', (c, a) => { 608 | return { 609 | stateName: 'get-money', 610 | moneyInserted: c.moneyInserted + a.money 611 | } as const; 612 | }) 613 | .actionHandler('get-money', 'vend-soda', (c, _a) => { 614 | return c.moneyInserted >= 50 ? { 615 | stateName: 'vend', 616 | changeRemaining: c.moneyInserted - 50 617 | } as const : c; 618 | }) 619 | .actionHandler('vend', 'clock-tick', (c, _a) => { 620 | return { 621 | stateName: 'dispense-change', 622 | changeRemaining: c.changeRemaining 623 | } as const; 624 | }) 625 | .actionHandler('dispense-change', 'clock-tick', (c, _a) => { 626 | const coinVal = c.changeRemaining >= 25 627 | ? 25 628 | : c.changeRemaining >= 10 629 | ? 10 630 | : c.changeRemaining >= 5 631 | ? 5 632 | : 1; 633 | 634 | return c.changeRemaining - coinVal > 0 ? { 635 | stateName: 'dispense-change', 636 | changeRemaining: c.changeRemaining - coinVal 637 | } as const : { 638 | stateName: 'idle' 639 | } as const; 640 | }) 641 | .done(); 642 | 643 | let n = nextState({stateName: 'idle'}, { actionName: 'clock-tick'}); 644 | // Idle state doesn't repsond to clock-tick, so state is unchanged 645 | expect(n).toEqual({stateName: 'idle'}); 646 | n = nextState({stateName: 'idle'}, { actionName: 'insert-money', money: 25}) 647 | expect(n).toEqual({stateName: 'get-money', moneyInserted: 25}); 648 | n = nextState(n, { actionName: 'insert-money', money: 25}); 649 | expect(n).toEqual({stateName: 'get-money', moneyInserted: 50}); 650 | n = nextState(n, { actionName: 'insert-money', money: 27}); 651 | expect(n).toEqual({stateName: 'get-money', moneyInserted: 77}); 652 | n = nextState(n, { actionName: 'vend-soda'}); 653 | expect(n).toEqual({stateName: 'vend', changeRemaining: 27}); 654 | n = nextState(n, { actionName: 'clock-tick'}); 655 | expect(n).toEqual({stateName: 'dispense-change', changeRemaining: 27}); 656 | n = nextState(n, { actionName: 'clock-tick'}); 657 | expect(n).toEqual({stateName: 'dispense-change', changeRemaining: 2}); 658 | n = nextState(n, { actionName: 'clock-tick'}); 659 | expect(n).toEqual({stateName: 'dispense-change', changeRemaining: 1}); 660 | n = nextState(n, { actionName: 'clock-tick'}); 661 | expect(n).toEqual({stateName: 'idle'}); 662 | }) 663 | 664 | it('Should allow large state machines', () => { 665 | const NO_DOC = { 666 | stateName: 'no-doc' as const 667 | }; 668 | 669 | const NEW_DOC_STATE = { 670 | stateName: 'unnamed-doc' as const 671 | }; 672 | 673 | const NAMED_DOC = { 674 | stateName: 'named-doc' as const 675 | }; 676 | 677 | const FAILED_LOAD_DOC_STATE = { 678 | stateName: 'unrecoverable-error' as const 679 | }; 680 | 681 | stateMachine() 682 | .state('no-doc') 683 | .state('unrecoverable-error') 684 | .state('unnamed-doc') 685 | .state('named-doc') 686 | .transition('no-doc', 'unnamed-doc') // new 687 | .transition('no-doc', 'named-doc') // open 688 | .transition('no-doc', 'unrecoverable-error') // error page 689 | .transition('unrecoverable-error', 'no-doc') // close error 690 | .transition('unnamed-doc', 'unnamed-doc') // new 691 | .transition('unnamed-doc', 'named-doc') // save as or open 692 | .transition('unnamed-doc', 'no-doc') // close 693 | .transition('unnamed-doc', 'unrecoverable-error') // error page 694 | .transition('named-doc', 'no-doc') // close 695 | .transition('named-doc', 'named-doc') // save as 696 | .transition('named-doc', 'unnamed-doc') // new 697 | .transition('named-doc', 'unrecoverable-error') // error page 698 | .action('new-flow') // Fired on new 699 | .action('named-flow-success') // Fired on save, save as, load 700 | .action('failure') // Fired on failure to load a flow 701 | .action('access-denied') // Also fired on failure to load a flow 702 | .action('close-flow') 703 | .action('update-doc-version') 704 | .action('user-create-connection') 705 | .action('new-flow1') // Fired on new 706 | .action('named-flow-success1') // Fired on save, save as, load 707 | .action('failure1') // Fired on failure to load a flow 708 | .action('access-denied1') // Also fired on failure to load a flow 709 | .action('close-flow1') 710 | .action('update-doc-version1') 711 | .action('user-create-connection1') 712 | .actionHandler('no-doc', 'new-flow', (_c, _a) => { 713 | return NEW_DOC_STATE; 714 | }) 715 | .actionHandler('no-doc', 'failure', (_c, _a) => { 716 | return FAILED_LOAD_DOC_STATE; 717 | }) 718 | .actionHandler('no-doc', 'access-denied', (_c, _a) => { 719 | return FAILED_LOAD_DOC_STATE; 720 | }) 721 | .actionHandler('no-doc', 'named-flow-success', (_c, _a) => { 722 | return NAMED_DOC; 723 | }) 724 | .actionHandler('unnamed-doc', 'close-flow', (_c, _a) => { 725 | return NO_DOC; 726 | }) 727 | .actionHandler('unnamed-doc', 'new-flow', (_c, _a) => { 728 | return NEW_DOC_STATE; 729 | }) 730 | .actionHandler('unnamed-doc', 'named-flow-success', (_c, _a) => { 731 | return NAMED_DOC; 732 | }) 733 | .actionHandler('unnamed-doc', 'update-doc-version', (_c, _a) => { 734 | return NAMED_DOC; 735 | }) 736 | .actionHandler('unnamed-doc', 'failure', (_c, _a) => { 737 | return FAILED_LOAD_DOC_STATE; 738 | }) 739 | .actionHandler('unnamed-doc', 'access-denied', (_c, _a) => { 740 | return FAILED_LOAD_DOC_STATE; 741 | }) 742 | .actionHandler('named-doc', 'close-flow', (_c, _a) => { 743 | return NO_DOC; 744 | }) 745 | .actionHandler('named-doc', 'new-flow', (_c, _a) => { 746 | return NEW_DOC_STATE; 747 | }) 748 | .actionHandler('named-doc', 'named-flow-success', (_c, _a) => { 749 | return NAMED_DOC; 750 | }) 751 | .actionHandler('named-doc', 'update-doc-version', (_c, _a) => { 752 | return NAMED_DOC; 753 | }) 754 | .actionHandler('named-doc', 'failure', (_c, _a) => { 755 | return FAILED_LOAD_DOC_STATE; 756 | }) 757 | .actionHandler('named-doc', 'access-denied', (_c, _a) => { 758 | return FAILED_LOAD_DOC_STATE; 759 | }) 760 | .actionHandler('unrecoverable-error', 'close-flow', (_c, _a) => { 761 | return NO_DOC; 762 | }) 763 | .actionHandler('no-doc', 'new-flow', (_c, _a) => { 764 | return NEW_DOC_STATE; 765 | }) 766 | .actionHandler('no-doc', 'failure', (_c, _a) => { 767 | return FAILED_LOAD_DOC_STATE; 768 | }) 769 | .actionHandler('no-doc', 'access-denied', (_c, _a) => { 770 | return FAILED_LOAD_DOC_STATE; 771 | }) 772 | .actionHandler('no-doc', 'named-flow-success', (_c, _a) => { 773 | return NAMED_DOC; 774 | }) 775 | .actionHandler('unnamed-doc', 'close-flow', (_c, _a) => { 776 | return NO_DOC; 777 | }) 778 | .actionHandler('unnamed-doc', 'new-flow', (_c, _a) => { 779 | return NEW_DOC_STATE; 780 | }) 781 | .actionHandler('unnamed-doc', 'named-flow-success', (_c, _a) => { 782 | return NAMED_DOC; 783 | }) 784 | .actionHandler('unnamed-doc', 'update-doc-version', (_c, _a) => { 785 | return NAMED_DOC; 786 | }) 787 | .actionHandler('unnamed-doc', 'failure', (_c, _a) => { 788 | return FAILED_LOAD_DOC_STATE; 789 | }) 790 | .actionHandler('unnamed-doc', 'access-denied', (_c, _a) => { 791 | return FAILED_LOAD_DOC_STATE; 792 | }) 793 | .actionHandler('named-doc', 'close-flow', (_c, _a) => { 794 | return NO_DOC; 795 | }) 796 | .actionHandler('named-doc', 'new-flow', (_c, _a) => { 797 | return NEW_DOC_STATE; 798 | }) 799 | .actionHandler('named-doc', 'named-flow-success', (_c, _a) => { 800 | return NAMED_DOC; 801 | }) 802 | .actionHandler('named-doc', 'update-doc-version', (_c, _a) => { 803 | return NAMED_DOC; 804 | }) 805 | .actionHandler('named-doc', 'failure', (_c, _a) => { 806 | return FAILED_LOAD_DOC_STATE; 807 | }) 808 | .actionHandler('named-doc', 'access-denied', (_c, _a) => { 809 | return FAILED_LOAD_DOC_STATE; 810 | }) 811 | .actionHandler('unrecoverable-error', 'close-flow', (_c, _a) => { 812 | return NO_DOC; 813 | }) 814 | .done(); 815 | }); 816 | 817 | it('Should not allow specifying a state that does not reflect the argument', () => { 818 | stateMachine() 819 | .state<'a'>( 820 | // @ts-expect-error 821 | `face` 822 | ); 823 | }); 824 | 825 | it('Should not allow circumventing errors by using ErrorBrand strings', () => { 826 | stateMachine() 827 | .state<'a'>('a') 828 | .state<'a'>( 829 | // @ts-expect-error 830 | `'a' has already been declared` 831 | ); 832 | }); 833 | }) -------------------------------------------------------------------------------- /test/karma.conf.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const webpackConfig = require('./webpack.config.js'); 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | 7 | // base path that will be used to resolve all patterns (eg. files, exclude) 8 | basePath: '', 9 | 10 | // frameworks to use 11 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 12 | frameworks: ['jasmine'], 13 | 14 | // list of files / patterns to load in the browser 15 | files: [ 16 | '*.ts', 17 | ], 18 | 19 | mime: { 20 | 'text/x-typescript': ['ts', 'tsx'] 21 | }, 22 | 23 | // list of files to exclude 24 | exclude: [ 25 | ], 26 | 27 | // preprocess matching files before serving them to the browser 28 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 29 | preprocessors: { 30 | '*.ts': ['webpack'], 31 | }, 32 | 33 | webpack: { 34 | devtool: 'inline-source-map', 35 | resolve: webpackConfig.resolve, 36 | module: webpackConfig.module, 37 | externals: { 38 | }, 39 | }, 40 | 41 | webpackMiddleware: { 42 | noInfo: true, 43 | stats: 'errors-only' 44 | }, 45 | 46 | // test results reporter to use 47 | // possible values: 'dots', 'progress' 48 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter 49 | reporters: ['progress'], 50 | 51 | // web server port 52 | port: 9876, 53 | 54 | // enable / disable colors in the output (reporters and logs) 55 | colors: true, 56 | 57 | // level of logging 58 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 59 | logLevel: config.LOG_INFO, 60 | 61 | // enable / disable watching file and executing tests whenever any file changes 62 | autoWatch: true, 63 | 64 | // start these browsers 65 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 66 | browsers: ['Chrome'], 67 | 68 | // Concurrency level 69 | // how many browser should be started simultanous 70 | concurrency: Infinity, 71 | }); 72 | }; 73 | -------------------------------------------------------------------------------- /test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "declaration": false, 5 | "sourceMap": true, 6 | "strict": true, 7 | "strictNullChecks": true, 8 | "moduleResolution": "node", 9 | "noUnusedLocals": true, 10 | "noUnusedParameters": true, 11 | "noImplicitReturns": true, 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | 5 | entry: path.resolve(__dirname, 'src', 'Index.ts'), 6 | 7 | output: { 8 | path: path.resolve(__dirname, 'lib'), 9 | filename: 'index.js', 10 | library: 'ts-checked-fsm', 11 | libraryTarget: 'commonjs', 12 | }, 13 | 14 | stats: { 15 | assets: false, 16 | colors: true, 17 | hash: false, 18 | version: false 19 | }, 20 | 21 | devtool: 'source-map', 22 | 23 | resolve: { 24 | modules: [ 25 | path.resolve(__dirname, 'src'), 26 | 'node_modules' 27 | ], 28 | extensions: ['.ts', '.tsx', '.js'] 29 | }, 30 | 31 | module: { 32 | rules: [ 33 | { 34 | test: /\.tsx?$/, 35 | use: { 36 | loader: 'ts-loader', 37 | options: { 38 | compilerOptions: { 39 | outDir: '.', 40 | } 41 | } 42 | } 43 | }, 44 | ], 45 | }, 46 | 47 | externals: { 48 | 'redux': { 49 | root: 'redux', 50 | commonjs: 'redux', 51 | commonjs2: 'redux', 52 | amd: 'redux', 53 | }, 54 | 'react-saga': { 55 | root: 'redux-saga', 56 | commonjs: 'redux-saga', 57 | commonjs2: 'redux-saga', 58 | amd: 'redux-saga', 59 | } 60 | }, 61 | }; 62 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "declaration": true, 5 | "sourceMap": true, 6 | "strict": true, 7 | "strictNullChecks": true, 8 | "moduleResolution": "node", 9 | "noUnusedLocals": true, 10 | "noUnusedParameters": true, 11 | "noImplicitReturns": true, 12 | "outDir": ".", 13 | "moduleResolution": "node" 14 | }, 15 | "files": [ 16 | "src/index.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const CopyPkgJsonPlugin = require('copy-pkg-json-webpack-plugin'); 3 | 4 | module.exports = { 5 | mode: 'production', 6 | 7 | entry: path.resolve(__dirname, 'src', 'index.ts'), 8 | 9 | output: { 10 | path: path.resolve(__dirname, 'lib'), 11 | filename: 'index.js', 12 | library: { 13 | type: 'commonjs' 14 | } 15 | }, 16 | 17 | stats: { 18 | colors: true, 19 | hash: false, 20 | version: false 21 | }, 22 | 23 | devtool: 'source-map', 24 | 25 | resolve: { 26 | modules: [ 27 | 'node_modules' 28 | ], 29 | extensions: ['.ts', '.tsx', '.js'] 30 | }, 31 | 32 | module: { 33 | rules: [ 34 | { 35 | test: /\.tsx?$/, 36 | use: { 37 | loader: 'ts-loader', 38 | options: { 39 | configFile: path.resolve(__dirname, 'src', 'tsconfig.json') 40 | } 41 | } 42 | }, 43 | ], 44 | }, 45 | 46 | plugins: [ 47 | new CopyPkgJsonPlugin({ 48 | new: { 49 | "name": "ts-checked-fsm", 50 | "version": "1.1.0", 51 | "description": "A typescript library for defining state machine types with compile-time transition validation. Types are fun.", 52 | "main": "index.js", 53 | "typings": "types/index.d.ts", 54 | "author": "Rick Weber", 55 | "license": "ISC", 56 | }, 57 | }) 58 | ] 59 | }; 60 | 61 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@colors/colors@1.5.0": 6 | version "1.5.0" 7 | resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" 8 | integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== 9 | 10 | "@discoveryjs/json-ext@^0.5.0": 11 | version "0.5.7" 12 | resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" 13 | integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== 14 | 15 | "@jridgewell/gen-mapping@^0.3.0": 16 | version "0.3.1" 17 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" 18 | integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== 19 | dependencies: 20 | "@jridgewell/set-array" "^1.0.0" 21 | "@jridgewell/sourcemap-codec" "^1.4.10" 22 | "@jridgewell/trace-mapping" "^0.3.9" 23 | 24 | "@jridgewell/resolve-uri@^3.0.3": 25 | version "3.0.7" 26 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" 27 | integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== 28 | 29 | "@jridgewell/set-array@^1.0.0": 30 | version "1.1.1" 31 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" 32 | integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== 33 | 34 | "@jridgewell/source-map@^0.3.2": 35 | version "0.3.2" 36 | resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" 37 | integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== 38 | dependencies: 39 | "@jridgewell/gen-mapping" "^0.3.0" 40 | "@jridgewell/trace-mapping" "^0.3.9" 41 | 42 | "@jridgewell/sourcemap-codec@^1.4.10": 43 | version "1.4.13" 44 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" 45 | integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== 46 | 47 | "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": 48 | version "0.3.13" 49 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" 50 | integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== 51 | dependencies: 52 | "@jridgewell/resolve-uri" "^3.0.3" 53 | "@jridgewell/sourcemap-codec" "^1.4.10" 54 | 55 | "@types/component-emitter@^1.2.10": 56 | version "1.2.11" 57 | resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" 58 | integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== 59 | 60 | "@types/cookie@^0.4.1": 61 | version "0.4.1" 62 | resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" 63 | integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== 64 | 65 | "@types/cors@^2.8.12": 66 | version "2.8.12" 67 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" 68 | integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== 69 | 70 | "@types/eslint-scope@^3.7.3": 71 | version "3.7.3" 72 | resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" 73 | integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== 74 | dependencies: 75 | "@types/eslint" "*" 76 | "@types/estree" "*" 77 | 78 | "@types/eslint@*": 79 | version "8.4.3" 80 | resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.3.tgz#5c92815a3838b1985c90034cd85f26f59d9d0ece" 81 | integrity sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw== 82 | dependencies: 83 | "@types/estree" "*" 84 | "@types/json-schema" "*" 85 | 86 | "@types/estree@*", "@types/estree@^0.0.51": 87 | version "0.0.51" 88 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" 89 | integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== 90 | 91 | "@types/jasmine@4.0.3": 92 | version "4.0.3" 93 | resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-4.0.3.tgz#097ce710d70eb7f3662e96c1f75824dd22c27d5c" 94 | integrity sha512-Opp1LvvEuZdk8fSSvchK2mZwhVrsNT0JgJE9Di6MjnaIpmEXM8TLCPPrVtNTYh8+5MPdY8j9bAHMu2SSfwpZJg== 95 | 96 | "@types/json-schema@*", "@types/json-schema@^7.0.8": 97 | version "7.0.11" 98 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" 99 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 100 | 101 | "@types/karma@6.3.3": 102 | version "6.3.3" 103 | resolved "https://registry.yarnpkg.com/@types/karma/-/karma-6.3.3.tgz#fc48cc53d13ec9beeea3a2a47a2036ed7647ba29" 104 | integrity sha512-nRMec4mTCt+tkpRqh5/pAxmnjzEgAaalIq7mdfLFH88gSRC8+bxejLiSjHMMT/vHIhJHqg4GPIGCnCFbwvDRww== 105 | dependencies: 106 | "@types/node" "*" 107 | log4js "^6.4.1" 108 | 109 | "@types/node@*", "@types/node@>=10.0.0": 110 | version "18.0.0" 111 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" 112 | integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== 113 | 114 | "@webassemblyjs/ast@1.11.1": 115 | version "1.11.1" 116 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" 117 | integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== 118 | dependencies: 119 | "@webassemblyjs/helper-numbers" "1.11.1" 120 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 121 | 122 | "@webassemblyjs/floating-point-hex-parser@1.11.1": 123 | version "1.11.1" 124 | resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" 125 | integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== 126 | 127 | "@webassemblyjs/helper-api-error@1.11.1": 128 | version "1.11.1" 129 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" 130 | integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== 131 | 132 | "@webassemblyjs/helper-buffer@1.11.1": 133 | version "1.11.1" 134 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" 135 | integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== 136 | 137 | "@webassemblyjs/helper-numbers@1.11.1": 138 | version "1.11.1" 139 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" 140 | integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== 141 | dependencies: 142 | "@webassemblyjs/floating-point-hex-parser" "1.11.1" 143 | "@webassemblyjs/helper-api-error" "1.11.1" 144 | "@xtuc/long" "4.2.2" 145 | 146 | "@webassemblyjs/helper-wasm-bytecode@1.11.1": 147 | version "1.11.1" 148 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" 149 | integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== 150 | 151 | "@webassemblyjs/helper-wasm-section@1.11.1": 152 | version "1.11.1" 153 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" 154 | integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== 155 | dependencies: 156 | "@webassemblyjs/ast" "1.11.1" 157 | "@webassemblyjs/helper-buffer" "1.11.1" 158 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 159 | "@webassemblyjs/wasm-gen" "1.11.1" 160 | 161 | "@webassemblyjs/ieee754@1.11.1": 162 | version "1.11.1" 163 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" 164 | integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== 165 | dependencies: 166 | "@xtuc/ieee754" "^1.2.0" 167 | 168 | "@webassemblyjs/leb128@1.11.1": 169 | version "1.11.1" 170 | resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" 171 | integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== 172 | dependencies: 173 | "@xtuc/long" "4.2.2" 174 | 175 | "@webassemblyjs/utf8@1.11.1": 176 | version "1.11.1" 177 | resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" 178 | integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== 179 | 180 | "@webassemblyjs/wasm-edit@1.11.1": 181 | version "1.11.1" 182 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" 183 | integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== 184 | dependencies: 185 | "@webassemblyjs/ast" "1.11.1" 186 | "@webassemblyjs/helper-buffer" "1.11.1" 187 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 188 | "@webassemblyjs/helper-wasm-section" "1.11.1" 189 | "@webassemblyjs/wasm-gen" "1.11.1" 190 | "@webassemblyjs/wasm-opt" "1.11.1" 191 | "@webassemblyjs/wasm-parser" "1.11.1" 192 | "@webassemblyjs/wast-printer" "1.11.1" 193 | 194 | "@webassemblyjs/wasm-gen@1.11.1": 195 | version "1.11.1" 196 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" 197 | integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== 198 | dependencies: 199 | "@webassemblyjs/ast" "1.11.1" 200 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 201 | "@webassemblyjs/ieee754" "1.11.1" 202 | "@webassemblyjs/leb128" "1.11.1" 203 | "@webassemblyjs/utf8" "1.11.1" 204 | 205 | "@webassemblyjs/wasm-opt@1.11.1": 206 | version "1.11.1" 207 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" 208 | integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== 209 | dependencies: 210 | "@webassemblyjs/ast" "1.11.1" 211 | "@webassemblyjs/helper-buffer" "1.11.1" 212 | "@webassemblyjs/wasm-gen" "1.11.1" 213 | "@webassemblyjs/wasm-parser" "1.11.1" 214 | 215 | "@webassemblyjs/wasm-parser@1.11.1": 216 | version "1.11.1" 217 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" 218 | integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== 219 | dependencies: 220 | "@webassemblyjs/ast" "1.11.1" 221 | "@webassemblyjs/helper-api-error" "1.11.1" 222 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 223 | "@webassemblyjs/ieee754" "1.11.1" 224 | "@webassemblyjs/leb128" "1.11.1" 225 | "@webassemblyjs/utf8" "1.11.1" 226 | 227 | "@webassemblyjs/wast-printer@1.11.1": 228 | version "1.11.1" 229 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" 230 | integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== 231 | dependencies: 232 | "@webassemblyjs/ast" "1.11.1" 233 | "@xtuc/long" "4.2.2" 234 | 235 | "@webpack-cli/configtest@^1.2.0": 236 | version "1.2.0" 237 | resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" 238 | integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== 239 | 240 | "@webpack-cli/info@^1.5.0": 241 | version "1.5.0" 242 | resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" 243 | integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== 244 | dependencies: 245 | envinfo "^7.7.3" 246 | 247 | "@webpack-cli/serve@^1.7.0": 248 | version "1.7.0" 249 | resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" 250 | integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== 251 | 252 | "@xtuc/ieee754@^1.2.0": 253 | version "1.2.0" 254 | resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 255 | integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== 256 | 257 | "@xtuc/long@4.2.2": 258 | version "4.2.2" 259 | resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 260 | integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== 261 | 262 | accepts@~1.3.4: 263 | version "1.3.8" 264 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 265 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 266 | dependencies: 267 | mime-types "~2.1.34" 268 | negotiator "0.6.3" 269 | 270 | acorn-import-assertions@^1.7.6: 271 | version "1.8.0" 272 | resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" 273 | integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== 274 | 275 | acorn@^8.4.1, acorn@^8.5.0: 276 | version "8.7.1" 277 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" 278 | integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== 279 | 280 | ajv-keywords@^3.5.2: 281 | version "3.5.2" 282 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 283 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== 284 | 285 | ajv@^6.12.5: 286 | version "6.12.6" 287 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 288 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 289 | dependencies: 290 | fast-deep-equal "^3.1.1" 291 | fast-json-stable-stringify "^2.0.0" 292 | json-schema-traverse "^0.4.1" 293 | uri-js "^4.2.2" 294 | 295 | ansi-regex@^5.0.1: 296 | version "5.0.1" 297 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 298 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 299 | 300 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 301 | version "4.3.0" 302 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 303 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 304 | dependencies: 305 | color-convert "^2.0.1" 306 | 307 | anymatch@~3.1.2: 308 | version "3.1.2" 309 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 310 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 311 | dependencies: 312 | normalize-path "^3.0.0" 313 | picomatch "^2.0.4" 314 | 315 | balanced-match@^1.0.0: 316 | version "1.0.2" 317 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 318 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 319 | 320 | base64id@2.0.0, base64id@~2.0.0: 321 | version "2.0.0" 322 | resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" 323 | integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== 324 | 325 | binary-extensions@^2.0.0: 326 | version "2.2.0" 327 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 328 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 329 | 330 | body-parser@^1.19.0: 331 | version "1.20.0" 332 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" 333 | integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== 334 | dependencies: 335 | bytes "3.1.2" 336 | content-type "~1.0.4" 337 | debug "2.6.9" 338 | depd "2.0.0" 339 | destroy "1.2.0" 340 | http-errors "2.0.0" 341 | iconv-lite "0.4.24" 342 | on-finished "2.4.1" 343 | qs "6.10.3" 344 | raw-body "2.5.1" 345 | type-is "~1.6.18" 346 | unpipe "1.0.0" 347 | 348 | brace-expansion@^1.1.7: 349 | version "1.1.11" 350 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 351 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 352 | dependencies: 353 | balanced-match "^1.0.0" 354 | concat-map "0.0.1" 355 | 356 | braces@^3.0.2, braces@~3.0.2: 357 | version "3.0.2" 358 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 359 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 360 | dependencies: 361 | fill-range "^7.0.1" 362 | 363 | browserslist@^4.14.5: 364 | version "4.21.0" 365 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.0.tgz#7ab19572361a140ecd1e023e2c1ed95edda0cefe" 366 | integrity sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA== 367 | dependencies: 368 | caniuse-lite "^1.0.30001358" 369 | electron-to-chromium "^1.4.164" 370 | node-releases "^2.0.5" 371 | update-browserslist-db "^1.0.0" 372 | 373 | buffer-from@^1.0.0: 374 | version "1.1.2" 375 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 376 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 377 | 378 | bytes@3.1.2: 379 | version "3.1.2" 380 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 381 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 382 | 383 | call-bind@^1.0.0: 384 | version "1.0.2" 385 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 386 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 387 | dependencies: 388 | function-bind "^1.1.1" 389 | get-intrinsic "^1.0.2" 390 | 391 | caniuse-lite@^1.0.30001358: 392 | version "1.0.30001359" 393 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz#a1c1cbe1c2da9e689638813618b4219acbd4925e" 394 | integrity sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw== 395 | 396 | chalk@^4.1.0: 397 | version "4.1.2" 398 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 399 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 400 | dependencies: 401 | ansi-styles "^4.1.0" 402 | supports-color "^7.1.0" 403 | 404 | chokidar@^3.5.1: 405 | version "3.5.3" 406 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 407 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 408 | dependencies: 409 | anymatch "~3.1.2" 410 | braces "~3.0.2" 411 | glob-parent "~5.1.2" 412 | is-binary-path "~2.1.0" 413 | is-glob "~4.0.1" 414 | normalize-path "~3.0.0" 415 | readdirp "~3.6.0" 416 | optionalDependencies: 417 | fsevents "~2.3.2" 418 | 419 | chrome-trace-event@^1.0.2: 420 | version "1.0.3" 421 | resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" 422 | integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== 423 | 424 | cliui@^7.0.2: 425 | version "7.0.4" 426 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 427 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 428 | dependencies: 429 | string-width "^4.2.0" 430 | strip-ansi "^6.0.0" 431 | wrap-ansi "^7.0.0" 432 | 433 | clone-deep@^4.0.1: 434 | version "4.0.1" 435 | resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" 436 | integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== 437 | dependencies: 438 | is-plain-object "^2.0.4" 439 | kind-of "^6.0.2" 440 | shallow-clone "^3.0.0" 441 | 442 | color-convert@^2.0.1: 443 | version "2.0.1" 444 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 445 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 446 | dependencies: 447 | color-name "~1.1.4" 448 | 449 | color-name@~1.1.4: 450 | version "1.1.4" 451 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 452 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 453 | 454 | colorette@^2.0.14: 455 | version "2.0.19" 456 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" 457 | integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== 458 | 459 | commander@^2.20.0: 460 | version "2.20.3" 461 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 462 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 463 | 464 | commander@^7.0.0: 465 | version "7.2.0" 466 | resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" 467 | integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== 468 | 469 | component-emitter@~1.3.0: 470 | version "1.3.0" 471 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 472 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 473 | 474 | concat-map@0.0.1: 475 | version "0.0.1" 476 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 477 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 478 | 479 | connect@^3.7.0: 480 | version "3.7.0" 481 | resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" 482 | integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== 483 | dependencies: 484 | debug "2.6.9" 485 | finalhandler "1.1.2" 486 | parseurl "~1.3.3" 487 | utils-merge "1.0.1" 488 | 489 | content-type@~1.0.4: 490 | version "1.0.4" 491 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 492 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 493 | 494 | cookie@~0.4.1: 495 | version "0.4.2" 496 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" 497 | integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== 498 | 499 | copy-pkg-json-webpack-plugin@0.0.40: 500 | version "0.0.40" 501 | resolved "https://registry.yarnpkg.com/copy-pkg-json-webpack-plugin/-/copy-pkg-json-webpack-plugin-0.0.40.tgz#75919e4374c6ba48f4ba5f91326a60ef0f645414" 502 | integrity sha512-Zl6PIZvE6RylFP0n65bq002W5lWziJ9xb5X9b7fIpeRdxTC3tQ5d7Tve+D18RuU67vfuBFKIbTl9E0iAx6J78w== 503 | 504 | cors@~2.8.5: 505 | version "2.8.5" 506 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 507 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 508 | dependencies: 509 | object-assign "^4" 510 | vary "^1" 511 | 512 | cross-spawn@^7.0.3: 513 | version "7.0.3" 514 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 515 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 516 | dependencies: 517 | path-key "^3.1.0" 518 | shebang-command "^2.0.0" 519 | which "^2.0.1" 520 | 521 | custom-event@~1.0.0: 522 | version "1.0.1" 523 | resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" 524 | integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== 525 | 526 | date-format@^4.0.10: 527 | version "4.0.11" 528 | resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.11.tgz#ae0d1e069d7f0687938fd06f98c12f3a6276e526" 529 | integrity sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw== 530 | 531 | debug@2.6.9: 532 | version "2.6.9" 533 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 534 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 535 | dependencies: 536 | ms "2.0.0" 537 | 538 | debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: 539 | version "4.3.4" 540 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 541 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 542 | dependencies: 543 | ms "2.1.2" 544 | 545 | depd@2.0.0: 546 | version "2.0.0" 547 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 548 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 549 | 550 | destroy@1.2.0: 551 | version "1.2.0" 552 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 553 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 554 | 555 | di@^0.0.1: 556 | version "0.0.1" 557 | resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" 558 | integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== 559 | 560 | dom-serialize@^2.2.1: 561 | version "2.2.1" 562 | resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" 563 | integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== 564 | dependencies: 565 | custom-event "~1.0.0" 566 | ent "~2.2.0" 567 | extend "^3.0.0" 568 | void-elements "^2.0.0" 569 | 570 | ee-first@1.1.1: 571 | version "1.1.1" 572 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 573 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 574 | 575 | electron-to-chromium@^1.4.164: 576 | version "1.4.168" 577 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.168.tgz#8f6bda320a434ac963850d18e41d83220973cbdd" 578 | integrity sha512-yz247hclRBaP8ABB1hf9kL7AMfa+yC2hB9F3XF8Y87VWMnYgq4QYvV6acRACcDkTDxfGQ4GYK/aZPQiuFMGbaA== 579 | 580 | emoji-regex@^8.0.0: 581 | version "8.0.0" 582 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 583 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 584 | 585 | encodeurl@~1.0.2: 586 | version "1.0.2" 587 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 588 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 589 | 590 | engine.io-parser@~5.0.3: 591 | version "5.0.4" 592 | resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" 593 | integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== 594 | 595 | engine.io@~6.2.0: 596 | version "6.2.0" 597 | resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" 598 | integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== 599 | dependencies: 600 | "@types/cookie" "^0.4.1" 601 | "@types/cors" "^2.8.12" 602 | "@types/node" ">=10.0.0" 603 | accepts "~1.3.4" 604 | base64id "2.0.0" 605 | cookie "~0.4.1" 606 | cors "~2.8.5" 607 | debug "~4.3.1" 608 | engine.io-parser "~5.0.3" 609 | ws "~8.2.3" 610 | 611 | enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.3: 612 | version "5.9.3" 613 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" 614 | integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== 615 | dependencies: 616 | graceful-fs "^4.2.4" 617 | tapable "^2.2.0" 618 | 619 | ent@~2.2.0: 620 | version "2.2.0" 621 | resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" 622 | integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== 623 | 624 | envinfo@^7.7.3: 625 | version "7.8.1" 626 | resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" 627 | integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== 628 | 629 | es-module-lexer@^0.9.0: 630 | version "0.9.3" 631 | resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" 632 | integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== 633 | 634 | escalade@^3.1.1: 635 | version "3.1.1" 636 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 637 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 638 | 639 | escape-html@~1.0.3: 640 | version "1.0.3" 641 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 642 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 643 | 644 | eslint-scope@5.1.1: 645 | version "5.1.1" 646 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 647 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 648 | dependencies: 649 | esrecurse "^4.3.0" 650 | estraverse "^4.1.1" 651 | 652 | esrecurse@^4.3.0: 653 | version "4.3.0" 654 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 655 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 656 | dependencies: 657 | estraverse "^5.2.0" 658 | 659 | estraverse@^4.1.1: 660 | version "4.3.0" 661 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 662 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 663 | 664 | estraverse@^5.2.0: 665 | version "5.3.0" 666 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 667 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 668 | 669 | eventemitter3@^4.0.0: 670 | version "4.0.7" 671 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" 672 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 673 | 674 | events@^3.2.0: 675 | version "3.3.0" 676 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 677 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 678 | 679 | extend@^3.0.0: 680 | version "3.0.2" 681 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 682 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 683 | 684 | fast-deep-equal@^3.1.1: 685 | version "3.1.3" 686 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 687 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 688 | 689 | fast-json-stable-stringify@^2.0.0: 690 | version "2.1.0" 691 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 692 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 693 | 694 | fastest-levenshtein@^1.0.12: 695 | version "1.0.12" 696 | resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" 697 | integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== 698 | 699 | fill-range@^7.0.1: 700 | version "7.0.1" 701 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 702 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 703 | dependencies: 704 | to-regex-range "^5.0.1" 705 | 706 | finalhandler@1.1.2: 707 | version "1.1.2" 708 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 709 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 710 | dependencies: 711 | debug "2.6.9" 712 | encodeurl "~1.0.2" 713 | escape-html "~1.0.3" 714 | on-finished "~2.3.0" 715 | parseurl "~1.3.3" 716 | statuses "~1.5.0" 717 | unpipe "~1.0.0" 718 | 719 | find-up@^4.0.0: 720 | version "4.1.0" 721 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 722 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 723 | dependencies: 724 | locate-path "^5.0.0" 725 | path-exists "^4.0.0" 726 | 727 | flatted@^3.2.5: 728 | version "3.2.5" 729 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" 730 | integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== 731 | 732 | follow-redirects@^1.0.0: 733 | version "1.15.1" 734 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" 735 | integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== 736 | 737 | fs-extra@^10.1.0: 738 | version "10.1.0" 739 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" 740 | integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== 741 | dependencies: 742 | graceful-fs "^4.2.0" 743 | jsonfile "^6.0.1" 744 | universalify "^2.0.0" 745 | 746 | fs.realpath@^1.0.0: 747 | version "1.0.0" 748 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 749 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 750 | 751 | fsevents@~2.3.2: 752 | version "2.3.2" 753 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 754 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 755 | 756 | function-bind@^1.1.1: 757 | version "1.1.1" 758 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 759 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 760 | 761 | get-caller-file@^2.0.5: 762 | version "2.0.5" 763 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 764 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 765 | 766 | get-intrinsic@^1.0.2: 767 | version "1.1.2" 768 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" 769 | integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== 770 | dependencies: 771 | function-bind "^1.1.1" 772 | has "^1.0.3" 773 | has-symbols "^1.0.3" 774 | 775 | glob-parent@~5.1.2: 776 | version "5.1.2" 777 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 778 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 779 | dependencies: 780 | is-glob "^4.0.1" 781 | 782 | glob-to-regexp@^0.4.1: 783 | version "0.4.1" 784 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 785 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 786 | 787 | glob@^7.1.3, glob@^7.1.7: 788 | version "7.2.3" 789 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 790 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 791 | dependencies: 792 | fs.realpath "^1.0.0" 793 | inflight "^1.0.4" 794 | inherits "2" 795 | minimatch "^3.1.1" 796 | once "^1.3.0" 797 | path-is-absolute "^1.0.0" 798 | 799 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: 800 | version "4.2.10" 801 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" 802 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== 803 | 804 | has-flag@^4.0.0: 805 | version "4.0.0" 806 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 807 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 808 | 809 | has-symbols@^1.0.3: 810 | version "1.0.3" 811 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 812 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 813 | 814 | has@^1.0.3: 815 | version "1.0.3" 816 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 817 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 818 | dependencies: 819 | function-bind "^1.1.1" 820 | 821 | http-errors@2.0.0: 822 | version "2.0.0" 823 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 824 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 825 | dependencies: 826 | depd "2.0.0" 827 | inherits "2.0.4" 828 | setprototypeof "1.2.0" 829 | statuses "2.0.1" 830 | toidentifier "1.0.1" 831 | 832 | http-proxy@^1.18.1: 833 | version "1.18.1" 834 | resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" 835 | integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== 836 | dependencies: 837 | eventemitter3 "^4.0.0" 838 | follow-redirects "^1.0.0" 839 | requires-port "^1.0.0" 840 | 841 | iconv-lite@0.4.24: 842 | version "0.4.24" 843 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 844 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 845 | dependencies: 846 | safer-buffer ">= 2.1.2 < 3" 847 | 848 | import-local@^3.0.2: 849 | version "3.1.0" 850 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" 851 | integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== 852 | dependencies: 853 | pkg-dir "^4.2.0" 854 | resolve-cwd "^3.0.0" 855 | 856 | inflight@^1.0.4: 857 | version "1.0.6" 858 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 859 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 860 | dependencies: 861 | once "^1.3.0" 862 | wrappy "1" 863 | 864 | inherits@2, inherits@2.0.4: 865 | version "2.0.4" 866 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 867 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 868 | 869 | interpret@^2.2.0: 870 | version "2.2.0" 871 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" 872 | integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== 873 | 874 | is-binary-path@~2.1.0: 875 | version "2.1.0" 876 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 877 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 878 | dependencies: 879 | binary-extensions "^2.0.0" 880 | 881 | is-core-module@^2.9.0: 882 | version "2.9.0" 883 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" 884 | integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== 885 | dependencies: 886 | has "^1.0.3" 887 | 888 | is-extglob@^2.1.1: 889 | version "2.1.1" 890 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 891 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 892 | 893 | is-fullwidth-code-point@^3.0.0: 894 | version "3.0.0" 895 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 896 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 897 | 898 | is-glob@^4.0.1, is-glob@~4.0.1: 899 | version "4.0.3" 900 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 901 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 902 | dependencies: 903 | is-extglob "^2.1.1" 904 | 905 | is-number@^7.0.0: 906 | version "7.0.0" 907 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 908 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 909 | 910 | is-plain-object@^2.0.4: 911 | version "2.0.4" 912 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 913 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 914 | dependencies: 915 | isobject "^3.0.1" 916 | 917 | isbinaryfile@^4.0.8: 918 | version "4.0.10" 919 | resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" 920 | integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== 921 | 922 | isexe@^2.0.0: 923 | version "2.0.0" 924 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 925 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 926 | 927 | isobject@^3.0.1: 928 | version "3.0.1" 929 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 930 | integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== 931 | 932 | jasmine-core@^4.1.0: 933 | version "4.2.0" 934 | resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.2.0.tgz#0605bea284d6d78276f43c47de2532ecd4a73b00" 935 | integrity sha512-OcFpBrIhnbmb9wfI8cqPSJ50pv3Wg4/NSgoZIqHzIwO/2a9qivJWzv8hUvaREIMYYJBas6AvfXATFdVuzzCqVw== 936 | 937 | jest-worker@^27.4.5: 938 | version "27.5.1" 939 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" 940 | integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== 941 | dependencies: 942 | "@types/node" "*" 943 | merge-stream "^2.0.0" 944 | supports-color "^8.0.0" 945 | 946 | json-parse-even-better-errors@^2.3.1: 947 | version "2.3.1" 948 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 949 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 950 | 951 | json-schema-traverse@^0.4.1: 952 | version "0.4.1" 953 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 954 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 955 | 956 | jsonfile@^6.0.1: 957 | version "6.1.0" 958 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 959 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 960 | dependencies: 961 | universalify "^2.0.0" 962 | optionalDependencies: 963 | graceful-fs "^4.1.6" 964 | 965 | karma-chrome-launcher@3.1.1: 966 | version "3.1.1" 967 | resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz#baca9cc071b1562a1db241827257bfe5cab597ea" 968 | integrity sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== 969 | dependencies: 970 | which "^1.2.1" 971 | 972 | karma-jasmine@5.1.0: 973 | version "5.1.0" 974 | resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-5.1.0.tgz#3af4558a6502fa16856a0f346ec2193d4b884b2f" 975 | integrity sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ== 976 | dependencies: 977 | jasmine-core "^4.1.0" 978 | 979 | karma-webpack@5.0.0: 980 | version "5.0.0" 981 | resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" 982 | integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== 983 | dependencies: 984 | glob "^7.1.3" 985 | minimatch "^3.0.4" 986 | webpack-merge "^4.1.5" 987 | 988 | karma@6.4.0: 989 | version "6.4.0" 990 | resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.0.tgz#82652dfecdd853ec227b74ed718a997028a99508" 991 | integrity sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w== 992 | dependencies: 993 | "@colors/colors" "1.5.0" 994 | body-parser "^1.19.0" 995 | braces "^3.0.2" 996 | chokidar "^3.5.1" 997 | connect "^3.7.0" 998 | di "^0.0.1" 999 | dom-serialize "^2.2.1" 1000 | glob "^7.1.7" 1001 | graceful-fs "^4.2.6" 1002 | http-proxy "^1.18.1" 1003 | isbinaryfile "^4.0.8" 1004 | lodash "^4.17.21" 1005 | log4js "^6.4.1" 1006 | mime "^2.5.2" 1007 | minimatch "^3.0.4" 1008 | mkdirp "^0.5.5" 1009 | qjobs "^1.2.0" 1010 | range-parser "^1.2.1" 1011 | rimraf "^3.0.2" 1012 | socket.io "^4.4.1" 1013 | source-map "^0.6.1" 1014 | tmp "^0.2.1" 1015 | ua-parser-js "^0.7.30" 1016 | yargs "^16.1.1" 1017 | 1018 | kind-of@^6.0.2: 1019 | version "6.0.3" 1020 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 1021 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 1022 | 1023 | loader-runner@^4.2.0: 1024 | version "4.3.0" 1025 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" 1026 | integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== 1027 | 1028 | locate-path@^5.0.0: 1029 | version "5.0.0" 1030 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1031 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1032 | dependencies: 1033 | p-locate "^4.1.0" 1034 | 1035 | lodash@^4.17.15, lodash@^4.17.21: 1036 | version "4.17.21" 1037 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1038 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1039 | 1040 | log4js@^6.4.1: 1041 | version "6.5.2" 1042 | resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.5.2.tgz#9ae371e5b3cb3a3a209c24686e5547f8670834e5" 1043 | integrity sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A== 1044 | dependencies: 1045 | date-format "^4.0.10" 1046 | debug "^4.3.4" 1047 | flatted "^3.2.5" 1048 | rfdc "^1.3.0" 1049 | streamroller "^3.1.1" 1050 | 1051 | lru-cache@^6.0.0: 1052 | version "6.0.0" 1053 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1054 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1055 | dependencies: 1056 | yallist "^4.0.0" 1057 | 1058 | media-typer@0.3.0: 1059 | version "0.3.0" 1060 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1061 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 1062 | 1063 | merge-stream@^2.0.0: 1064 | version "2.0.0" 1065 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1066 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1067 | 1068 | micromatch@^4.0.0: 1069 | version "4.0.5" 1070 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1071 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1072 | dependencies: 1073 | braces "^3.0.2" 1074 | picomatch "^2.3.1" 1075 | 1076 | mime-db@1.52.0: 1077 | version "1.52.0" 1078 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1079 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1080 | 1081 | mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: 1082 | version "2.1.35" 1083 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1084 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1085 | dependencies: 1086 | mime-db "1.52.0" 1087 | 1088 | mime@^2.5.2: 1089 | version "2.6.0" 1090 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" 1091 | integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== 1092 | 1093 | minimatch@^3.0.4, minimatch@^3.1.1: 1094 | version "3.1.2" 1095 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1096 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1097 | dependencies: 1098 | brace-expansion "^1.1.7" 1099 | 1100 | minimist@^1.2.6: 1101 | version "1.2.6" 1102 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 1103 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 1104 | 1105 | mkdirp@^0.5.5: 1106 | version "0.5.6" 1107 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" 1108 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 1109 | dependencies: 1110 | minimist "^1.2.6" 1111 | 1112 | ms@2.0.0: 1113 | version "2.0.0" 1114 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1115 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 1116 | 1117 | ms@2.1.2: 1118 | version "2.1.2" 1119 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1120 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1121 | 1122 | negotiator@0.6.3: 1123 | version "0.6.3" 1124 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 1125 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 1126 | 1127 | neo-async@^2.6.2: 1128 | version "2.6.2" 1129 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 1130 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== 1131 | 1132 | node-releases@^2.0.5: 1133 | version "2.0.5" 1134 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" 1135 | integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== 1136 | 1137 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1138 | version "3.0.0" 1139 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1140 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1141 | 1142 | object-assign@^4: 1143 | version "4.1.1" 1144 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1145 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1146 | 1147 | object-inspect@^1.9.0: 1148 | version "1.12.2" 1149 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 1150 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 1151 | 1152 | on-finished@2.4.1: 1153 | version "2.4.1" 1154 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 1155 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1156 | dependencies: 1157 | ee-first "1.1.1" 1158 | 1159 | on-finished@~2.3.0: 1160 | version "2.3.0" 1161 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1162 | integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== 1163 | dependencies: 1164 | ee-first "1.1.1" 1165 | 1166 | once@^1.3.0: 1167 | version "1.4.0" 1168 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1169 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1170 | dependencies: 1171 | wrappy "1" 1172 | 1173 | p-limit@^2.2.0: 1174 | version "2.3.0" 1175 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1176 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1177 | dependencies: 1178 | p-try "^2.0.0" 1179 | 1180 | p-locate@^4.1.0: 1181 | version "4.1.0" 1182 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1183 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1184 | dependencies: 1185 | p-limit "^2.2.0" 1186 | 1187 | p-try@^2.0.0: 1188 | version "2.2.0" 1189 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1190 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1191 | 1192 | parseurl@~1.3.3: 1193 | version "1.3.3" 1194 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1195 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1196 | 1197 | path-exists@^4.0.0: 1198 | version "4.0.0" 1199 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1200 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1201 | 1202 | path-is-absolute@^1.0.0: 1203 | version "1.0.1" 1204 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1205 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1206 | 1207 | path-key@^3.1.0: 1208 | version "3.1.1" 1209 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1210 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1211 | 1212 | path-parse@^1.0.7: 1213 | version "1.0.7" 1214 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1215 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1216 | 1217 | picocolors@^1.0.0: 1218 | version "1.0.0" 1219 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1220 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1221 | 1222 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1223 | version "2.3.1" 1224 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1225 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1226 | 1227 | pkg-dir@^4.2.0: 1228 | version "4.2.0" 1229 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1230 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1231 | dependencies: 1232 | find-up "^4.0.0" 1233 | 1234 | punycode@^2.1.0: 1235 | version "2.1.1" 1236 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1237 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1238 | 1239 | qjobs@^1.2.0: 1240 | version "1.2.0" 1241 | resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" 1242 | integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== 1243 | 1244 | qs@6.10.3: 1245 | version "6.10.3" 1246 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" 1247 | integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== 1248 | dependencies: 1249 | side-channel "^1.0.4" 1250 | 1251 | randombytes@^2.1.0: 1252 | version "2.1.0" 1253 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1254 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1255 | dependencies: 1256 | safe-buffer "^5.1.0" 1257 | 1258 | range-parser@^1.2.1: 1259 | version "1.2.1" 1260 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1261 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1262 | 1263 | raw-body@2.5.1: 1264 | version "2.5.1" 1265 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 1266 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 1267 | dependencies: 1268 | bytes "3.1.2" 1269 | http-errors "2.0.0" 1270 | iconv-lite "0.4.24" 1271 | unpipe "1.0.0" 1272 | 1273 | readdirp@~3.6.0: 1274 | version "3.6.0" 1275 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1276 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1277 | dependencies: 1278 | picomatch "^2.2.1" 1279 | 1280 | rechoir@^0.7.0: 1281 | version "0.7.1" 1282 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" 1283 | integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== 1284 | dependencies: 1285 | resolve "^1.9.0" 1286 | 1287 | require-directory@^2.1.1: 1288 | version "2.1.1" 1289 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1290 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 1291 | 1292 | requires-port@^1.0.0: 1293 | version "1.0.0" 1294 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 1295 | integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== 1296 | 1297 | resolve-cwd@^3.0.0: 1298 | version "3.0.0" 1299 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 1300 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== 1301 | dependencies: 1302 | resolve-from "^5.0.0" 1303 | 1304 | resolve-from@^5.0.0: 1305 | version "5.0.0" 1306 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1307 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1308 | 1309 | resolve@^1.9.0: 1310 | version "1.22.1" 1311 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 1312 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 1313 | dependencies: 1314 | is-core-module "^2.9.0" 1315 | path-parse "^1.0.7" 1316 | supports-preserve-symlinks-flag "^1.0.0" 1317 | 1318 | rfdc@^1.3.0: 1319 | version "1.3.0" 1320 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" 1321 | integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== 1322 | 1323 | rimraf@^3.0.0, rimraf@^3.0.2: 1324 | version "3.0.2" 1325 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1326 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1327 | dependencies: 1328 | glob "^7.1.3" 1329 | 1330 | safe-buffer@^5.1.0: 1331 | version "5.2.1" 1332 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1333 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1334 | 1335 | "safer-buffer@>= 2.1.2 < 3": 1336 | version "2.1.2" 1337 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1338 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1339 | 1340 | schema-utils@^3.1.0, schema-utils@^3.1.1: 1341 | version "3.1.1" 1342 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" 1343 | integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== 1344 | dependencies: 1345 | "@types/json-schema" "^7.0.8" 1346 | ajv "^6.12.5" 1347 | ajv-keywords "^3.5.2" 1348 | 1349 | semver@^7.3.4: 1350 | version "7.3.7" 1351 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" 1352 | integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== 1353 | dependencies: 1354 | lru-cache "^6.0.0" 1355 | 1356 | serialize-javascript@^6.0.0: 1357 | version "6.0.0" 1358 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1359 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1360 | dependencies: 1361 | randombytes "^2.1.0" 1362 | 1363 | setprototypeof@1.2.0: 1364 | version "1.2.0" 1365 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1366 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1367 | 1368 | shallow-clone@^3.0.0: 1369 | version "3.0.1" 1370 | resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" 1371 | integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== 1372 | dependencies: 1373 | kind-of "^6.0.2" 1374 | 1375 | shebang-command@^2.0.0: 1376 | version "2.0.0" 1377 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1378 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1379 | dependencies: 1380 | shebang-regex "^3.0.0" 1381 | 1382 | shebang-regex@^3.0.0: 1383 | version "3.0.0" 1384 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1385 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1386 | 1387 | side-channel@^1.0.4: 1388 | version "1.0.4" 1389 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1390 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1391 | dependencies: 1392 | call-bind "^1.0.0" 1393 | get-intrinsic "^1.0.2" 1394 | object-inspect "^1.9.0" 1395 | 1396 | socket.io-adapter@~2.4.0: 1397 | version "2.4.0" 1398 | resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" 1399 | integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== 1400 | 1401 | socket.io-parser@~4.0.4: 1402 | version "4.0.4" 1403 | resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" 1404 | integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== 1405 | dependencies: 1406 | "@types/component-emitter" "^1.2.10" 1407 | component-emitter "~1.3.0" 1408 | debug "~4.3.1" 1409 | 1410 | socket.io@^4.4.1: 1411 | version "4.5.1" 1412 | resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.1.tgz#aa7e73f8a6ce20ee3c54b2446d321bbb6b1a9029" 1413 | integrity sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ== 1414 | dependencies: 1415 | accepts "~1.3.4" 1416 | base64id "~2.0.0" 1417 | debug "~4.3.2" 1418 | engine.io "~6.2.0" 1419 | socket.io-adapter "~2.4.0" 1420 | socket.io-parser "~4.0.4" 1421 | 1422 | source-map-support@~0.5.20: 1423 | version "0.5.21" 1424 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 1425 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 1426 | dependencies: 1427 | buffer-from "^1.0.0" 1428 | source-map "^0.6.0" 1429 | 1430 | source-map@^0.6.0, source-map@^0.6.1: 1431 | version "0.6.1" 1432 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1433 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1434 | 1435 | statuses@2.0.1: 1436 | version "2.0.1" 1437 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1438 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1439 | 1440 | statuses@~1.5.0: 1441 | version "1.5.0" 1442 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1443 | integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== 1444 | 1445 | streamroller@^3.1.1: 1446 | version "3.1.1" 1447 | resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.1.tgz#679aae10a4703acdf2740755307df0a05ad752e6" 1448 | integrity sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ== 1449 | dependencies: 1450 | date-format "^4.0.10" 1451 | debug "^4.3.4" 1452 | fs-extra "^10.1.0" 1453 | 1454 | string-width@^4.1.0, string-width@^4.2.0: 1455 | version "4.2.3" 1456 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1457 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1458 | dependencies: 1459 | emoji-regex "^8.0.0" 1460 | is-fullwidth-code-point "^3.0.0" 1461 | strip-ansi "^6.0.1" 1462 | 1463 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1464 | version "6.0.1" 1465 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1466 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1467 | dependencies: 1468 | ansi-regex "^5.0.1" 1469 | 1470 | supports-color@^7.1.0: 1471 | version "7.2.0" 1472 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1473 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1474 | dependencies: 1475 | has-flag "^4.0.0" 1476 | 1477 | supports-color@^8.0.0: 1478 | version "8.1.1" 1479 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1480 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1481 | dependencies: 1482 | has-flag "^4.0.0" 1483 | 1484 | supports-preserve-symlinks-flag@^1.0.0: 1485 | version "1.0.0" 1486 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1487 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1488 | 1489 | tapable@^2.1.1, tapable@^2.2.0: 1490 | version "2.2.1" 1491 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" 1492 | integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== 1493 | 1494 | terser-webpack-plugin@^5.1.3: 1495 | version "5.3.3" 1496 | resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" 1497 | integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== 1498 | dependencies: 1499 | "@jridgewell/trace-mapping" "^0.3.7" 1500 | jest-worker "^27.4.5" 1501 | schema-utils "^3.1.1" 1502 | serialize-javascript "^6.0.0" 1503 | terser "^5.7.2" 1504 | 1505 | terser@^5.7.2: 1506 | version "5.14.1" 1507 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.1.tgz#7c95eec36436cb11cf1902cc79ac564741d19eca" 1508 | integrity sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ== 1509 | dependencies: 1510 | "@jridgewell/source-map" "^0.3.2" 1511 | acorn "^8.5.0" 1512 | commander "^2.20.0" 1513 | source-map-support "~0.5.20" 1514 | 1515 | tmp@^0.2.1: 1516 | version "0.2.1" 1517 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" 1518 | integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== 1519 | dependencies: 1520 | rimraf "^3.0.0" 1521 | 1522 | to-regex-range@^5.0.1: 1523 | version "5.0.1" 1524 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1525 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1526 | dependencies: 1527 | is-number "^7.0.0" 1528 | 1529 | toidentifier@1.0.1: 1530 | version "1.0.1" 1531 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1532 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1533 | 1534 | ts-loader@9.3.1: 1535 | version "9.3.1" 1536 | resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.1.tgz#fe25cca56e3e71c1087fe48dc67f4df8c59b22d4" 1537 | integrity sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw== 1538 | dependencies: 1539 | chalk "^4.1.0" 1540 | enhanced-resolve "^5.0.0" 1541 | micromatch "^4.0.0" 1542 | semver "^7.3.4" 1543 | 1544 | type-is@~1.6.18: 1545 | version "1.6.18" 1546 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1547 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1548 | dependencies: 1549 | media-typer "0.3.0" 1550 | mime-types "~2.1.24" 1551 | 1552 | typescript@4.7.4: 1553 | version "4.7.4" 1554 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" 1555 | integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== 1556 | 1557 | ua-parser-js@^0.7.30: 1558 | version "0.7.31" 1559 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" 1560 | integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== 1561 | 1562 | universalify@^2.0.0: 1563 | version "2.0.0" 1564 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 1565 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 1566 | 1567 | unpipe@1.0.0, unpipe@~1.0.0: 1568 | version "1.0.0" 1569 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1570 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 1571 | 1572 | update-browserslist-db@^1.0.0: 1573 | version "1.0.4" 1574 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" 1575 | integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== 1576 | dependencies: 1577 | escalade "^3.1.1" 1578 | picocolors "^1.0.0" 1579 | 1580 | uri-js@^4.2.2: 1581 | version "4.4.1" 1582 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1583 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1584 | dependencies: 1585 | punycode "^2.1.0" 1586 | 1587 | utils-merge@1.0.1: 1588 | version "1.0.1" 1589 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1590 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 1591 | 1592 | vary@^1: 1593 | version "1.1.2" 1594 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1595 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 1596 | 1597 | void-elements@^2.0.0: 1598 | version "2.0.1" 1599 | resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" 1600 | integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== 1601 | 1602 | watchpack@^2.3.1: 1603 | version "2.4.0" 1604 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" 1605 | integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== 1606 | dependencies: 1607 | glob-to-regexp "^0.4.1" 1608 | graceful-fs "^4.1.2" 1609 | 1610 | webpack-cli@4.10.0: 1611 | version "4.10.0" 1612 | resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" 1613 | integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== 1614 | dependencies: 1615 | "@discoveryjs/json-ext" "^0.5.0" 1616 | "@webpack-cli/configtest" "^1.2.0" 1617 | "@webpack-cli/info" "^1.5.0" 1618 | "@webpack-cli/serve" "^1.7.0" 1619 | colorette "^2.0.14" 1620 | commander "^7.0.0" 1621 | cross-spawn "^7.0.3" 1622 | fastest-levenshtein "^1.0.12" 1623 | import-local "^3.0.2" 1624 | interpret "^2.2.0" 1625 | rechoir "^0.7.0" 1626 | webpack-merge "^5.7.3" 1627 | 1628 | webpack-merge@^4.1.5: 1629 | version "4.2.2" 1630 | resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" 1631 | integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== 1632 | dependencies: 1633 | lodash "^4.17.15" 1634 | 1635 | webpack-merge@^5.7.3: 1636 | version "5.8.0" 1637 | resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" 1638 | integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== 1639 | dependencies: 1640 | clone-deep "^4.0.1" 1641 | wildcard "^2.0.0" 1642 | 1643 | webpack-sources@^3.2.3: 1644 | version "3.2.3" 1645 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" 1646 | integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== 1647 | 1648 | webpack@5.73.0: 1649 | version "5.73.0" 1650 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" 1651 | integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== 1652 | dependencies: 1653 | "@types/eslint-scope" "^3.7.3" 1654 | "@types/estree" "^0.0.51" 1655 | "@webassemblyjs/ast" "1.11.1" 1656 | "@webassemblyjs/wasm-edit" "1.11.1" 1657 | "@webassemblyjs/wasm-parser" "1.11.1" 1658 | acorn "^8.4.1" 1659 | acorn-import-assertions "^1.7.6" 1660 | browserslist "^4.14.5" 1661 | chrome-trace-event "^1.0.2" 1662 | enhanced-resolve "^5.9.3" 1663 | es-module-lexer "^0.9.0" 1664 | eslint-scope "5.1.1" 1665 | events "^3.2.0" 1666 | glob-to-regexp "^0.4.1" 1667 | graceful-fs "^4.2.9" 1668 | json-parse-even-better-errors "^2.3.1" 1669 | loader-runner "^4.2.0" 1670 | mime-types "^2.1.27" 1671 | neo-async "^2.6.2" 1672 | schema-utils "^3.1.0" 1673 | tapable "^2.1.1" 1674 | terser-webpack-plugin "^5.1.3" 1675 | watchpack "^2.3.1" 1676 | webpack-sources "^3.2.3" 1677 | 1678 | which@^1.2.1: 1679 | version "1.3.1" 1680 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1681 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1682 | dependencies: 1683 | isexe "^2.0.0" 1684 | 1685 | which@^2.0.1: 1686 | version "2.0.2" 1687 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1688 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1689 | dependencies: 1690 | isexe "^2.0.0" 1691 | 1692 | wildcard@^2.0.0: 1693 | version "2.0.0" 1694 | resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" 1695 | integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== 1696 | 1697 | wrap-ansi@^7.0.0: 1698 | version "7.0.0" 1699 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1700 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1701 | dependencies: 1702 | ansi-styles "^4.0.0" 1703 | string-width "^4.1.0" 1704 | strip-ansi "^6.0.0" 1705 | 1706 | wrappy@1: 1707 | version "1.0.2" 1708 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1709 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1710 | 1711 | ws@~8.2.3: 1712 | version "8.2.3" 1713 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" 1714 | integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== 1715 | 1716 | y18n@^5.0.5: 1717 | version "5.0.8" 1718 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1719 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1720 | 1721 | yallist@^4.0.0: 1722 | version "4.0.0" 1723 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1724 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1725 | 1726 | yargs-parser@^20.2.2: 1727 | version "20.2.9" 1728 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1729 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1730 | 1731 | yargs@^16.1.1: 1732 | version "16.2.0" 1733 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1734 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1735 | dependencies: 1736 | cliui "^7.0.2" 1737 | escalade "^3.1.1" 1738 | get-caller-file "^2.0.5" 1739 | require-directory "^2.1.1" 1740 | string-width "^4.2.0" 1741 | y18n "^5.0.5" 1742 | yargs-parser "^20.2.2" 1743 | --------------------------------------------------------------------------------