Open Source the first set of MediaPipe Tasks tests for Web
PiperOrigin-RevId: 493673279
This commit is contained in:
		
							parent
							
								
									3c0ddf16b4
								
							
						
					
					
						commit
						2811e0c5c8
					
				|  | @ -228,6 +228,8 @@ def mediapipe_ts_library( | ||||||
|         srcs = srcs, |         srcs = srcs, | ||||||
|         visibility = visibility, |         visibility = visibility, | ||||||
|         deps = deps + [ |         deps = deps + [ | ||||||
|  |             "@npm//@types/jasmine", | ||||||
|  |             "@npm//@types/node", | ||||||
|             "@npm//@types/offscreencanvas", |             "@npm//@types/offscreencanvas", | ||||||
|             "@npm//@types/google-protobuf", |             "@npm//@types/google-protobuf", | ||||||
|         ], |         ], | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| # This package contains options shared by all MediaPipe Tasks for Web. | # This package contains options shared by all MediaPipe Tasks for Web. | ||||||
| 
 | 
 | ||||||
|  | load("@npm//@bazel/jasmine:index.bzl", "jasmine_node_test") | ||||||
| load("//mediapipe/framework/port:build_config.bzl", "mediapipe_ts_library") | load("//mediapipe/framework/port:build_config.bzl", "mediapipe_ts_library") | ||||||
| 
 | 
 | ||||||
| package(default_visibility = ["//mediapipe/tasks:internal"]) | package(default_visibility = ["//mediapipe/tasks:internal"]) | ||||||
|  | @ -13,6 +14,22 @@ mediapipe_ts_library( | ||||||
|     ], |     ], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | mediapipe_ts_library( | ||||||
|  |     name = "classifier_options_test_lib", | ||||||
|  |     testonly = True, | ||||||
|  |     srcs = ["classifier_options.test.ts"], | ||||||
|  |     deps = [ | ||||||
|  |         ":classifier_options", | ||||||
|  |         "//mediapipe/tasks/cc/components/processors/proto:classifier_options_jspb_proto", | ||||||
|  |         "//mediapipe/tasks/web/core:classifier_options", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | jasmine_node_test( | ||||||
|  |     name = "classifier_options_test", | ||||||
|  |     deps = [":classifier_options_test_lib"], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| mediapipe_ts_library( | mediapipe_ts_library( | ||||||
|     name = "classifier_result", |     name = "classifier_result", | ||||||
|     srcs = ["classifier_result.ts"], |     srcs = ["classifier_result.ts"], | ||||||
|  | @ -22,6 +39,22 @@ mediapipe_ts_library( | ||||||
|     ], |     ], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | mediapipe_ts_library( | ||||||
|  |     name = "classifier_result_test_lib", | ||||||
|  |     testonly = True, | ||||||
|  |     srcs = ["classifier_result.test.ts"], | ||||||
|  |     deps = [ | ||||||
|  |         ":classifier_result", | ||||||
|  |         "//mediapipe/framework/formats:classification_jspb_proto", | ||||||
|  |         "//mediapipe/tasks/cc/components/containers/proto:classifications_jspb_proto", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | jasmine_node_test( | ||||||
|  |     name = "classifier_result_test", | ||||||
|  |     deps = [":classifier_result_test_lib"], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| mediapipe_ts_library( | mediapipe_ts_library( | ||||||
|     name = "embedder_result", |     name = "embedder_result", | ||||||
|     srcs = ["embedder_result.ts"], |     srcs = ["embedder_result.ts"], | ||||||
|  | @ -31,6 +64,21 @@ mediapipe_ts_library( | ||||||
|     ], |     ], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | mediapipe_ts_library( | ||||||
|  |     name = "embedder_result_test_lib", | ||||||
|  |     testonly = True, | ||||||
|  |     srcs = ["embedder_result.test.ts"], | ||||||
|  |     deps = [ | ||||||
|  |         ":embedder_result", | ||||||
|  |         "//mediapipe/tasks/cc/components/containers/proto:embeddings_jspb_proto", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | jasmine_node_test( | ||||||
|  |     name = "embedder_result_test", | ||||||
|  |     deps = [":embedder_result_test_lib"], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| mediapipe_ts_library( | mediapipe_ts_library( | ||||||
|     name = "embedder_options", |     name = "embedder_options", | ||||||
|     srcs = ["embedder_options.ts"], |     srcs = ["embedder_options.ts"], | ||||||
|  | @ -40,6 +88,22 @@ mediapipe_ts_library( | ||||||
|     ], |     ], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | mediapipe_ts_library( | ||||||
|  |     name = "embedder_options_test_lib", | ||||||
|  |     testonly = True, | ||||||
|  |     srcs = ["embedder_options.test.ts"], | ||||||
|  |     deps = [ | ||||||
|  |         ":embedder_options", | ||||||
|  |         "//mediapipe/tasks/cc/components/processors/proto:embedder_options_jspb_proto", | ||||||
|  |         "//mediapipe/tasks/web/core:embedder_options", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | jasmine_node_test( | ||||||
|  |     name = "embedder_options_test", | ||||||
|  |     deps = [":embedder_options_test_lib"], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| mediapipe_ts_library( | mediapipe_ts_library( | ||||||
|     name = "base_options", |     name = "base_options", | ||||||
|     srcs = [ |     srcs = [ | ||||||
|  | @ -53,3 +117,15 @@ mediapipe_ts_library( | ||||||
|         "//mediapipe/tasks/web/core", |         "//mediapipe/tasks/web/core", | ||||||
|     ], |     ], | ||||||
| ) | ) | ||||||
|  | 
 | ||||||
|  | mediapipe_ts_library( | ||||||
|  |     name = "base_options_test_lib", | ||||||
|  |     testonly = True, | ||||||
|  |     srcs = ["base_options.test.ts"], | ||||||
|  |     deps = [":base_options"], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | jasmine_node_test( | ||||||
|  |     name = "base_options_test", | ||||||
|  |     deps = [":base_options_test_lib"], | ||||||
|  | ) | ||||||
|  |  | ||||||
							
								
								
									
										127
									
								
								mediapipe/tasks/web/components/processors/base_options.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								mediapipe/tasks/web/components/processors/base_options.test.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,127 @@ | ||||||
|  | /** | ||||||
|  |  * Copyright 2022 The MediaPipe Authors. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | import 'jasmine'; | ||||||
|  | 
 | ||||||
|  | // Placeholder for internal dependency on encodeByteArray
 | ||||||
|  | // Placeholder for internal dependency on trusted resource URL builder
 | ||||||
|  | 
 | ||||||
|  | import {convertBaseOptionsToProto} from './base_options'; | ||||||
|  | 
 | ||||||
|  | describe('convertBaseOptionsToProto()', () => { | ||||||
|  |   const mockBytes = new Uint8Array([0, 1, 2, 3]); | ||||||
|  |   const mockBytesResult = { | ||||||
|  |     modelAsset: { | ||||||
|  |       fileContent: Buffer.from(mockBytes).toString('base64'), | ||||||
|  |       fileName: undefined, | ||||||
|  |       fileDescriptorMeta: undefined, | ||||||
|  |       filePointerMeta: undefined, | ||||||
|  |     }, | ||||||
|  |     useStreamMode: false, | ||||||
|  |     acceleration: { | ||||||
|  |       xnnpack: undefined, | ||||||
|  |       gpu: undefined, | ||||||
|  |       tflite: {}, | ||||||
|  |     }, | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   let fetchSpy: jasmine.Spy; | ||||||
|  | 
 | ||||||
|  |   beforeEach(() => { | ||||||
|  |     fetchSpy = jasmine.createSpy().and.callFake(async url => { | ||||||
|  |       expect(url).toEqual('foo'); | ||||||
|  |       return { | ||||||
|  |         arrayBuffer: () => mockBytes.buffer, | ||||||
|  |       } as unknown as Response; | ||||||
|  |     }); | ||||||
|  |     global.fetch = fetchSpy; | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('verifies that at least one model asset option is provided', async () => { | ||||||
|  |     await expectAsync(convertBaseOptionsToProto({})) | ||||||
|  |         .toBeRejectedWithError( | ||||||
|  |             /Either baseOptions.modelAssetPath or baseOptions.modelAssetBuffer must be set/); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('verifies that no more than one model asset option is provided', async () => { | ||||||
|  |     await expectAsync(convertBaseOptionsToProto({ | ||||||
|  |       modelAssetPath: `foo`, | ||||||
|  |       modelAssetBuffer: new Uint8Array([]) | ||||||
|  |     })) | ||||||
|  |         .toBeRejectedWithError( | ||||||
|  |             /Cannot set both baseOptions.modelAssetPath and baseOptions.modelAssetBuffer/); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('downloads model', async () => { | ||||||
|  |     const baseOptionsProto = await convertBaseOptionsToProto({ | ||||||
|  |       modelAssetPath: `foo`, | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     expect(fetchSpy).toHaveBeenCalled(); | ||||||
|  |     expect(baseOptionsProto.toObject()).toEqual(mockBytesResult); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('does not download model when bytes are provided', async () => { | ||||||
|  |     const baseOptionsProto = await convertBaseOptionsToProto({ | ||||||
|  |       modelAssetBuffer: new Uint8Array(mockBytes), | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     expect(fetchSpy).not.toHaveBeenCalled(); | ||||||
|  |     expect(baseOptionsProto.toObject()).toEqual(mockBytesResult); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('can enable CPU delegate', async () => { | ||||||
|  |     const baseOptionsProto = await convertBaseOptionsToProto({ | ||||||
|  |       modelAssetBuffer: new Uint8Array(mockBytes), | ||||||
|  |       delegate: 'cpu', | ||||||
|  |     }); | ||||||
|  |     expect(baseOptionsProto.toObject()).toEqual(mockBytesResult); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('can enable GPU delegate', async () => { | ||||||
|  |     const baseOptionsProto = await convertBaseOptionsToProto({ | ||||||
|  |       modelAssetBuffer: new Uint8Array(mockBytes), | ||||||
|  |       delegate: 'gpu', | ||||||
|  |     }); | ||||||
|  |     expect(baseOptionsProto.toObject()).toEqual({ | ||||||
|  |       ...mockBytesResult, | ||||||
|  |       acceleration: { | ||||||
|  |         xnnpack: undefined, | ||||||
|  |         gpu: { | ||||||
|  |           useAdvancedGpuApi: false, | ||||||
|  |           api: 0, | ||||||
|  |           allowPrecisionLoss: true, | ||||||
|  |           cachedKernelPath: undefined, | ||||||
|  |           serializedModelDir: undefined, | ||||||
|  |           modelToken: undefined, | ||||||
|  |           usage: 2, | ||||||
|  |         }, | ||||||
|  |         tflite: undefined, | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('can reset delegate', async () => { | ||||||
|  |     let baseOptionsProto = await convertBaseOptionsToProto({ | ||||||
|  |       modelAssetBuffer: new Uint8Array(mockBytes), | ||||||
|  |       delegate: 'gpu', | ||||||
|  |     }); | ||||||
|  |     // Clear backend
 | ||||||
|  |     baseOptionsProto = | ||||||
|  |         await convertBaseOptionsToProto({delegate: undefined}, baseOptionsProto); | ||||||
|  |     expect(baseOptionsProto.toObject()).toEqual(mockBytesResult); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
|  | @ -0,0 +1,114 @@ | ||||||
|  | /** | ||||||
|  |  * Copyright 2022 The MediaPipe Authors. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | import 'jasmine'; | ||||||
|  | 
 | ||||||
|  | import {ClassifierOptions as ClassifierOptionsProto} from '../../../../tasks/cc/components/processors/proto/classifier_options_pb'; | ||||||
|  | import {ClassifierOptions} from '../../../../tasks/web/core/classifier_options'; | ||||||
|  | 
 | ||||||
|  | import {convertClassifierOptionsToProto} from './classifier_options'; | ||||||
|  | 
 | ||||||
|  | interface TestCase { | ||||||
|  |   optionName: keyof ClassifierOptions; | ||||||
|  |   protoName: string; | ||||||
|  |   customValue: unknown; | ||||||
|  |   defaultValue: unknown; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | describe('convertClassifierOptionsToProto()', () => { | ||||||
|  |   function verifyOption( | ||||||
|  |       actualClassifierOptions: ClassifierOptionsProto, | ||||||
|  |       expectedClassifierOptions: Record<string, unknown> = {}): void { | ||||||
|  |     expect(actualClassifierOptions.toObject()) | ||||||
|  |         .toEqual(jasmine.objectContaining(expectedClassifierOptions)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const testCases: TestCase[] = [ | ||||||
|  |     { | ||||||
|  |       optionName: 'maxResults', | ||||||
|  |       protoName: 'maxResults', | ||||||
|  |       customValue: 5, | ||||||
|  |       defaultValue: -1 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       optionName: 'displayNamesLocale', | ||||||
|  |       protoName: 'displayNamesLocale', | ||||||
|  |       customValue: 'en', | ||||||
|  |       defaultValue: 'en' | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       optionName: 'scoreThreshold', | ||||||
|  |       protoName: 'scoreThreshold', | ||||||
|  |       customValue: 0.1, | ||||||
|  |       defaultValue: undefined | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       optionName: 'categoryAllowlist', | ||||||
|  |       protoName: 'categoryAllowlistList', | ||||||
|  |       customValue: ['foo'], | ||||||
|  |       defaultValue: [] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       optionName: 'categoryDenylist', | ||||||
|  |       protoName: 'categoryDenylistList', | ||||||
|  |       customValue: ['bar'], | ||||||
|  |       defaultValue: [] | ||||||
|  |     }, | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   for (const testCase of testCases) { | ||||||
|  |     it(`can set ${testCase.optionName}`, () => { | ||||||
|  |       const classifierOptionsProto = convertClassifierOptionsToProto( | ||||||
|  |           {[testCase.optionName]: testCase.customValue}); | ||||||
|  |       verifyOption( | ||||||
|  |           classifierOptionsProto, {[testCase.protoName]: testCase.customValue}); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     it(`can clear ${testCase.optionName}`, () => { | ||||||
|  |       let classifierOptionsProto = convertClassifierOptionsToProto( | ||||||
|  |           {[testCase.optionName]: testCase.customValue}); | ||||||
|  |       verifyOption( | ||||||
|  |           classifierOptionsProto, {[testCase.protoName]: testCase.customValue}); | ||||||
|  | 
 | ||||||
|  |       classifierOptionsProto = | ||||||
|  |           convertClassifierOptionsToProto({[testCase.optionName]: undefined}); | ||||||
|  |       verifyOption( | ||||||
|  |           classifierOptionsProto, | ||||||
|  |           {[testCase.protoName]: testCase.defaultValue}); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   it('overwrites options', () => { | ||||||
|  |     let classifierOptionsProto = | ||||||
|  |         convertClassifierOptionsToProto({maxResults: 1}); | ||||||
|  |     verifyOption(classifierOptionsProto, {'maxResults': 1}); | ||||||
|  | 
 | ||||||
|  |     classifierOptionsProto = convertClassifierOptionsToProto( | ||||||
|  |         {maxResults: 2}, classifierOptionsProto); | ||||||
|  |     verifyOption(classifierOptionsProto, {'maxResults': 2}); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('merges options', () => { | ||||||
|  |     let classifierOptionsProto = | ||||||
|  |         convertClassifierOptionsToProto({maxResults: 1}); | ||||||
|  |     verifyOption(classifierOptionsProto, {'maxResults': 1}); | ||||||
|  | 
 | ||||||
|  |     classifierOptionsProto = convertClassifierOptionsToProto( | ||||||
|  |         {displayNamesLocale: 'en'}, classifierOptionsProto); | ||||||
|  |     verifyOption( | ||||||
|  |         classifierOptionsProto, {'maxResults': 1, 'displayNamesLocale': 'en'}); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
|  | @ -0,0 +1,80 @@ | ||||||
|  | /** | ||||||
|  |  * Copyright 2022 The MediaPipe Authors. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | import 'jasmine'; | ||||||
|  | 
 | ||||||
|  | import {Classification, ClassificationList} from '../../../../framework/formats/classification_pb'; | ||||||
|  | import {ClassificationResult, Classifications} from '../../../../tasks/cc/components/containers/proto/classifications_pb'; | ||||||
|  | 
 | ||||||
|  | import {convertFromClassificationResultProto} from './classifier_result'; | ||||||
|  | 
 | ||||||
|  | // The OSS JS API does not support the builder pattern.
 | ||||||
|  | // tslint:disable:jspb-use-builder-pattern
 | ||||||
|  | 
 | ||||||
|  | describe('convertFromClassificationResultProto()', () => { | ||||||
|  |   it('transforms custom values', () => { | ||||||
|  |     const classificationResult = new ClassificationResult(); | ||||||
|  |     classificationResult.setTimestampMs(1); | ||||||
|  |     const classifcations = new Classifications(); | ||||||
|  |     classifcations.setHeadIndex(1); | ||||||
|  |     classifcations.setHeadName('headName'); | ||||||
|  |     const classificationList = new ClassificationList(); | ||||||
|  |     const clasification = new Classification(); | ||||||
|  |     clasification.setIndex(2); | ||||||
|  |     clasification.setScore(0.3); | ||||||
|  |     clasification.setDisplayName('displayName'); | ||||||
|  |     clasification.setLabel('categoryName'); | ||||||
|  |     classificationList.addClassification(clasification); | ||||||
|  |     classifcations.setClassificationList(classificationList); | ||||||
|  |     classificationResult.addClassifications(classifcations); | ||||||
|  | 
 | ||||||
|  |     const result = convertFromClassificationResultProto(classificationResult); | ||||||
|  | 
 | ||||||
|  |     expect(result).toEqual({ | ||||||
|  |       classifications: [{ | ||||||
|  |         categories: [{ | ||||||
|  |           index: 2, | ||||||
|  |           score: 0.3, | ||||||
|  |           displayName: 'displayName', | ||||||
|  |           categoryName: 'categoryName' | ||||||
|  |         }], | ||||||
|  |         headIndex: 1, | ||||||
|  |         headName: 'headName' | ||||||
|  |       }], | ||||||
|  |       timestampMs: 1 | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('transforms default values', () => { | ||||||
|  |     const classificationResult = new ClassificationResult(); | ||||||
|  |     const classifcations = new Classifications(); | ||||||
|  |     const classificationList = new ClassificationList(); | ||||||
|  |     const clasification = new Classification(); | ||||||
|  |     classificationList.addClassification(clasification); | ||||||
|  |     classifcations.setClassificationList(classificationList); | ||||||
|  |     classificationResult.addClassifications(classifcations); | ||||||
|  | 
 | ||||||
|  |     const result = convertFromClassificationResultProto(classificationResult); | ||||||
|  | 
 | ||||||
|  |     expect(result).toEqual({ | ||||||
|  |       classifications: [{ | ||||||
|  |         categories: [{index: 0, score: 0, displayName: '', categoryName: ''}], | ||||||
|  |         headIndex: 0, | ||||||
|  |         headName: '' | ||||||
|  |       }], | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
|  | @ -0,0 +1,93 @@ | ||||||
|  | /** | ||||||
|  |  * Copyright 2022 The MediaPipe Authors. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | import 'jasmine'; | ||||||
|  | 
 | ||||||
|  | import {EmbedderOptions as EmbedderOptionsProto} from '../../../../tasks/cc/components/processors/proto/embedder_options_pb'; | ||||||
|  | import {EmbedderOptions} from '../../../../tasks/web/core/embedder_options'; | ||||||
|  | 
 | ||||||
|  | import {convertEmbedderOptionsToProto} from './embedder_options'; | ||||||
|  | 
 | ||||||
|  | interface TestCase { | ||||||
|  |   optionName: keyof EmbedderOptions; | ||||||
|  |   protoName: string; | ||||||
|  |   customValue: unknown; | ||||||
|  |   defaultValue: unknown; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | describe('convertEmbedderOptionsToProto()', () => { | ||||||
|  |   function verifyOption( | ||||||
|  |       actualEmbedderOptions: EmbedderOptionsProto, | ||||||
|  |       expectedEmbedderOptions: Record<string, unknown> = {}): void { | ||||||
|  |     expect(actualEmbedderOptions.toObject()) | ||||||
|  |         .toEqual(jasmine.objectContaining(expectedEmbedderOptions)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const testCases: TestCase[] = [ | ||||||
|  |     { | ||||||
|  |       optionName: 'l2Normalize', | ||||||
|  |       protoName: 'l2Normalize', | ||||||
|  |       customValue: true, | ||||||
|  |       defaultValue: undefined | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       optionName: 'quantize', | ||||||
|  |       protoName: 'quantize', | ||||||
|  |       customValue: true, | ||||||
|  |       defaultValue: undefined | ||||||
|  |     }, | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   for (const testCase of testCases) { | ||||||
|  |     it(`can set ${testCase.optionName}`, () => { | ||||||
|  |       const embedderOptionsProto = convertEmbedderOptionsToProto( | ||||||
|  |           {[testCase.optionName]: testCase.customValue}); | ||||||
|  |       verifyOption( | ||||||
|  |           embedderOptionsProto, {[testCase.protoName]: testCase.customValue}); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     it(`can clear ${testCase.optionName}`, () => { | ||||||
|  |       let embedderOptionsProto = convertEmbedderOptionsToProto( | ||||||
|  |           {[testCase.optionName]: testCase.customValue}); | ||||||
|  |       verifyOption( | ||||||
|  |           embedderOptionsProto, {[testCase.protoName]: testCase.customValue}); | ||||||
|  | 
 | ||||||
|  |       embedderOptionsProto = | ||||||
|  |           convertEmbedderOptionsToProto({[testCase.optionName]: undefined}); | ||||||
|  |       verifyOption( | ||||||
|  |           embedderOptionsProto, {[testCase.protoName]: testCase.defaultValue}); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   it('overwrites options', () => { | ||||||
|  |     let embedderOptionsProto = | ||||||
|  |         convertEmbedderOptionsToProto({l2Normalize: true}); | ||||||
|  |     verifyOption(embedderOptionsProto, {'l2Normalize': true}); | ||||||
|  | 
 | ||||||
|  |     embedderOptionsProto = convertEmbedderOptionsToProto( | ||||||
|  |         {l2Normalize: false}, embedderOptionsProto); | ||||||
|  |     verifyOption(embedderOptionsProto, {'l2Normalize': false}); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('replaces options', () => { | ||||||
|  |     let embedderOptionsProto = convertEmbedderOptionsToProto({quantize: true}); | ||||||
|  |     verifyOption(embedderOptionsProto, {'quantize': true}); | ||||||
|  | 
 | ||||||
|  |     embedderOptionsProto = convertEmbedderOptionsToProto( | ||||||
|  |         {l2Normalize: true}, embedderOptionsProto); | ||||||
|  |     verifyOption(embedderOptionsProto, {'l2Normalize': true, 'quantize': true}); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
|  | @ -0,0 +1,75 @@ | ||||||
|  | /** | ||||||
|  |  * Copyright 2022 The MediaPipe Authors. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | import 'jasmine'; | ||||||
|  | 
 | ||||||
|  | import {Embedding, EmbeddingResult, FloatEmbedding, QuantizedEmbedding} from '../../../../tasks/cc/components/containers/proto/embeddings_pb'; | ||||||
|  | 
 | ||||||
|  | import {convertFromEmbeddingResultProto} from './embedder_result'; | ||||||
|  | 
 | ||||||
|  | // The OSS JS API does not support the builder pattern.
 | ||||||
|  | // tslint:disable:jspb-use-builder-pattern
 | ||||||
|  | 
 | ||||||
|  | describe('convertFromEmbeddingResultProto()', () => { | ||||||
|  |   it('transforms custom values', () => { | ||||||
|  |     const embedding = new Embedding(); | ||||||
|  |     embedding.setHeadIndex(1); | ||||||
|  |     embedding.setHeadName('headName'); | ||||||
|  | 
 | ||||||
|  |     const floatEmbedding = new FloatEmbedding(); | ||||||
|  |     floatEmbedding.setValuesList([0.1, 0.9]); | ||||||
|  | 
 | ||||||
|  |     embedding.setFloatEmbedding(floatEmbedding); | ||||||
|  |     const resultProto = new EmbeddingResult(); | ||||||
|  |     resultProto.addEmbeddings(embedding); | ||||||
|  |     resultProto.setTimestampMs(1); | ||||||
|  | 
 | ||||||
|  |     const embedderResult = convertFromEmbeddingResultProto(resultProto); | ||||||
|  |     const embeddings = embedderResult.embeddings; | ||||||
|  |     const timestampMs = embedderResult.timestampMs; | ||||||
|  |     expect(embeddings.length).toEqual(1); | ||||||
|  |     expect(embeddings[0]) | ||||||
|  |         .toEqual( | ||||||
|  |             {floatEmbedding: [0.1, 0.9], headIndex: 1, headName: 'headName'}); | ||||||
|  |     expect(timestampMs).toEqual(1); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('transforms custom quantized values', () => { | ||||||
|  |     const embedding = new Embedding(); | ||||||
|  |     embedding.setHeadIndex(1); | ||||||
|  |     embedding.setHeadName('headName'); | ||||||
|  | 
 | ||||||
|  |     const quantizedEmbedding = new QuantizedEmbedding(); | ||||||
|  |     const quantizedValues = new Uint8Array([1, 2, 3]); | ||||||
|  |     quantizedEmbedding.setValues(quantizedValues); | ||||||
|  | 
 | ||||||
|  |     embedding.setQuantizedEmbedding(quantizedEmbedding); | ||||||
|  |     const resultProto = new EmbeddingResult(); | ||||||
|  |     resultProto.addEmbeddings(embedding); | ||||||
|  |     resultProto.setTimestampMs(1); | ||||||
|  | 
 | ||||||
|  |     const embedderResult = convertFromEmbeddingResultProto(resultProto); | ||||||
|  |     const embeddings = embedderResult.embeddings; | ||||||
|  |     const timestampMs = embedderResult.timestampMs; | ||||||
|  |     expect(embeddings.length).toEqual(1); | ||||||
|  |     expect(embeddings[0]).toEqual({ | ||||||
|  |       quantizedEmbedding: new Uint8Array([1, 2, 3]), | ||||||
|  |       headIndex: 1, | ||||||
|  |       headName: 'headName' | ||||||
|  |     }); | ||||||
|  |     expect(timestampMs).toEqual(1); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| load("//mediapipe/framework/port:build_config.bzl", "mediapipe_ts_library") | load("//mediapipe/framework/port:build_config.bzl", "mediapipe_ts_library") | ||||||
|  | load("@npm//@bazel/jasmine:index.bzl", "jasmine_node_test") | ||||||
| 
 | 
 | ||||||
| package(default_visibility = ["//mediapipe/tasks:internal"]) | package(default_visibility = ["//mediapipe/tasks:internal"]) | ||||||
| 
 | 
 | ||||||
|  | @ -9,3 +10,18 @@ mediapipe_ts_library( | ||||||
|         "//mediapipe/tasks/web/components/containers:embedding_result", |         "//mediapipe/tasks/web/components/containers:embedding_result", | ||||||
|     ], |     ], | ||||||
| ) | ) | ||||||
|  | 
 | ||||||
|  | mediapipe_ts_library( | ||||||
|  |     name = "cosine_similarity_test_lib", | ||||||
|  |     testonly = True, | ||||||
|  |     srcs = ["cosine_similarity.test.ts"], | ||||||
|  |     deps = [ | ||||||
|  |         ":cosine_similarity", | ||||||
|  |         "//mediapipe/tasks/web/components/containers:embedding_result", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | jasmine_node_test( | ||||||
|  |     name = "cosine_similarity_test", | ||||||
|  |     deps = [":cosine_similarity_test_lib"], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,85 @@ | ||||||
|  | /** | ||||||
|  |  * Copyright 2022 The MediaPipe Authors. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may | ||||||
|  |  * not use this file except in compliance with the License. You may obtain a | ||||||
|  |  * copy of the License at | ||||||
|  |  * | ||||||
|  |  * <p>http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * <p>Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||||
|  |  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||||
|  |  * License for the specific language governing permissions and limitations under | ||||||
|  |  * the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | import {Embedding} from '../../../../tasks/web/components/containers/embedding_result'; | ||||||
|  | 
 | ||||||
|  | import {computeCosineSimilarity} from './cosine_similarity'; | ||||||
|  | 
 | ||||||
|  | describe('computeCosineSimilarity', () => { | ||||||
|  |   it('fails with quantized and float embeddings', () => { | ||||||
|  |     const u: Embedding = {floatEmbedding: [1.0], headIndex: 0, headName: ''}; | ||||||
|  |     const v: Embedding = { | ||||||
|  |       quantizedEmbedding: new Uint8Array([1.0]), | ||||||
|  |       headIndex: 0, | ||||||
|  |       headName: '' | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     expect(() => computeCosineSimilarity(u, v)) | ||||||
|  |         .toThrowError( | ||||||
|  |             /Cannot compute cosine similarity between quantized and float embeddings/); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('fails with zero norm', () => { | ||||||
|  |     const u = {floatEmbedding: [0.0], headIndex: 0, headName: ''}; | ||||||
|  |     expect(() => computeCosineSimilarity(u, u)) | ||||||
|  |         .toThrowError( | ||||||
|  |             /Cannot compute cosine similarity on embedding with 0 norm/); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('fails with different sizes', () => { | ||||||
|  |     const u: | ||||||
|  |         Embedding = {floatEmbedding: [1.0, 2.0], headIndex: 0, headName: ''}; | ||||||
|  |     const v: Embedding = { | ||||||
|  |       floatEmbedding: [1.0, 2.0, 3.0], | ||||||
|  |       headIndex: 0, | ||||||
|  |       headName: '' | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     expect(() => computeCosineSimilarity(u, v)) | ||||||
|  |         .toThrowError( | ||||||
|  |             /Cannot compute cosine similarity between embeddings of different sizes/); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('succeeds with float embeddings', () => { | ||||||
|  |     const u: Embedding = { | ||||||
|  |       floatEmbedding: [1.0, 0.0, 0.0, 0.0], | ||||||
|  |       headIndex: 0, | ||||||
|  |       headName: '' | ||||||
|  |     }; | ||||||
|  |     const v: Embedding = { | ||||||
|  |       floatEmbedding: [0.5, 0.5, 0.5, 0.5], | ||||||
|  |       headIndex: 0, | ||||||
|  |       headName: '' | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     expect(computeCosineSimilarity(u, v)).toEqual(0.5); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('succeeds with quantized embeddings', () => { | ||||||
|  |     const u: Embedding = { | ||||||
|  |       quantizedEmbedding: new Uint8Array([255, 128, 128, 128]), | ||||||
|  |       headIndex: 0, | ||||||
|  |       headName: '' | ||||||
|  |     }; | ||||||
|  |     const v: Embedding = { | ||||||
|  |       quantizedEmbedding: new Uint8Array([0, 128, 128, 128]), | ||||||
|  |       headIndex: 0, | ||||||
|  |       headName: '' | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     expect(computeCosineSimilarity(u, v)).toEqual(-1.0); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| # This package contains options shared by all MediaPipe Tasks for Web. | # This package contains options shared by all MediaPipe Tasks for Web. | ||||||
| 
 | 
 | ||||||
| load("//mediapipe/framework/port:build_config.bzl", "mediapipe_ts_declaration", "mediapipe_ts_library") | load("//mediapipe/framework/port:build_config.bzl", "mediapipe_ts_declaration", "mediapipe_ts_library") | ||||||
|  | load("@npm//@bazel/jasmine:index.bzl", "jasmine_node_test") | ||||||
| 
 | 
 | ||||||
| package(default_visibility = ["//mediapipe/tasks:internal"]) | package(default_visibility = ["//mediapipe/tasks:internal"]) | ||||||
| 
 | 
 | ||||||
|  | @ -32,6 +33,38 @@ mediapipe_ts_library( | ||||||
|     deps = [":core"], |     deps = [":core"], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | mediapipe_ts_library( | ||||||
|  |     name = "task_runner_test_utils", | ||||||
|  |     testonly = True, | ||||||
|  |     srcs = [ | ||||||
|  |         "task_runner_test_utils.ts", | ||||||
|  |     ], | ||||||
|  |     deps = [ | ||||||
|  |         "//mediapipe/framework:calculator_jspb_proto", | ||||||
|  |         "//mediapipe/web/graph_runner:graph_runner_ts", | ||||||
|  |         "//mediapipe/web/graph_runner:register_model_resources_graph_service_ts", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | mediapipe_ts_library( | ||||||
|  |     name = "task_runner_test_lib", | ||||||
|  |     testonly = True, | ||||||
|  |     srcs = [ | ||||||
|  |         "task_runner_test.ts", | ||||||
|  |     ], | ||||||
|  |     deps = [ | ||||||
|  |         ":task_runner", | ||||||
|  |         ":task_runner_test_utils", | ||||||
|  |         "//mediapipe/tasks/cc/core/proto:base_options_jspb_proto", | ||||||
|  |         "//mediapipe/web/graph_runner:graph_runner_ts", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | jasmine_node_test( | ||||||
|  |     name = "task_runner_test", | ||||||
|  |     deps = [":task_runner_test_lib"], | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| mediapipe_ts_declaration( | mediapipe_ts_declaration( | ||||||
|     name = "classifier_options", |     name = "classifier_options", | ||||||
|     srcs = ["classifier_options.d.ts"], |     srcs = ["classifier_options.d.ts"], | ||||||
|  |  | ||||||
|  | @ -77,9 +77,10 @@ export abstract class TaskRunner { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   constructor( |   constructor( | ||||||
|       wasmModule: WasmModule, |       wasmModule: WasmModule, glCanvas?: HTMLCanvasElement|OffscreenCanvas|null, | ||||||
|       glCanvas?: HTMLCanvasElement|OffscreenCanvas|null) { |       graphRunner?: GraphRunnerImageLib) { | ||||||
|     this.graphRunner = new GraphRunnerImageLib(wasmModule, glCanvas); |     this.graphRunner = | ||||||
|  |         graphRunner ?? new GraphRunnerImageLib(wasmModule, glCanvas); | ||||||
| 
 | 
 | ||||||
|     // Disables the automatic render-to-screen code, which allows for pure
 |     // Disables the automatic render-to-screen code, which allows for pure
 | ||||||
|     // CPU processing.
 |     // CPU processing.
 | ||||||
|  |  | ||||||
							
								
								
									
										107
									
								
								mediapipe/tasks/web/core/task_runner_test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								mediapipe/tasks/web/core/task_runner_test.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,107 @@ | ||||||
|  | /** | ||||||
|  |  * Copyright 2022 The MediaPipe Authors. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | import 'jasmine'; | ||||||
|  | 
 | ||||||
|  | import {BaseOptions as BaseOptionsProto} from '../../../tasks/cc/core/proto/base_options_pb'; | ||||||
|  | import {TaskRunner} from '../../../tasks/web/core/task_runner'; | ||||||
|  | import {createSpyWasmModule, SpyWasmModule} from '../../../tasks/web/core/task_runner_test_utils'; | ||||||
|  | import {ErrorListener} from '../../../web/graph_runner/graph_runner'; | ||||||
|  | 
 | ||||||
|  | import {GraphRunnerImageLib} from './task_runner'; | ||||||
|  | 
 | ||||||
|  | class TaskRunnerFake extends TaskRunner { | ||||||
|  |   protected baseOptions = new BaseOptionsProto(); | ||||||
|  |   private errorListener: ErrorListener|undefined; | ||||||
|  |   private errors: string[] = []; | ||||||
|  | 
 | ||||||
|  |   static createFake(): TaskRunnerFake { | ||||||
|  |     const wasmModule = createSpyWasmModule(); | ||||||
|  |     return new TaskRunnerFake(wasmModule); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   constructor(wasmModuleFake: SpyWasmModule) { | ||||||
|  |     super( | ||||||
|  |         wasmModuleFake, /* glCanvas= */ null, | ||||||
|  |         jasmine.createSpyObj<GraphRunnerImageLib>([ | ||||||
|  |           'setAutoRenderToScreen', 'setGraph', 'finishProcessing', | ||||||
|  |           'registerModelResourcesGraphService', 'attachErrorListener' | ||||||
|  |         ])); | ||||||
|  |     const graphRunner = this.graphRunner as jasmine.SpyObj<GraphRunnerImageLib>; | ||||||
|  |     expect(graphRunner.registerModelResourcesGraphService).toHaveBeenCalled(); | ||||||
|  |     expect(graphRunner.setAutoRenderToScreen).toHaveBeenCalled(); | ||||||
|  |     graphRunner.attachErrorListener.and.callFake(listener => { | ||||||
|  |       this.errorListener = listener; | ||||||
|  |     }); | ||||||
|  |     graphRunner.setGraph.and.callFake(() => { | ||||||
|  |       this.throwErrors(); | ||||||
|  |     }); | ||||||
|  |     graphRunner.finishProcessing.and.callFake(() => { | ||||||
|  |       this.throwErrors(); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   enqueueError(message: string): void { | ||||||
|  |     this.errors.push(message); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   override finishProcessing(): void { | ||||||
|  |     super.finishProcessing(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   override setGraph(graphData: Uint8Array, isBinary: boolean): void { | ||||||
|  |     super.setGraph(graphData, isBinary); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private throwErrors(): void { | ||||||
|  |     expect(this.errorListener).toBeDefined(); | ||||||
|  |     for (const error of this.errors) { | ||||||
|  |       this.errorListener!(/* errorCode= */ -1, error); | ||||||
|  |     } | ||||||
|  |     this.errors = []; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | describe('TaskRunner', () => { | ||||||
|  |   it('handles errors during graph update', () => { | ||||||
|  |     const taskRunner = TaskRunnerFake.createFake(); | ||||||
|  |     taskRunner.enqueueError('Test error'); | ||||||
|  | 
 | ||||||
|  |     expect(() => { | ||||||
|  |       taskRunner.setGraph(new Uint8Array(0), /* isBinary= */ true); | ||||||
|  |     }).toThrowError('Test error'); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('handles errors during graph execution', () => { | ||||||
|  |     const taskRunner = TaskRunnerFake.createFake(); | ||||||
|  |     taskRunner.setGraph(new Uint8Array(0), /* isBinary= */ true); | ||||||
|  | 
 | ||||||
|  |     taskRunner.enqueueError('Test error'); | ||||||
|  | 
 | ||||||
|  |     expect(() => { | ||||||
|  |       taskRunner.finishProcessing(); | ||||||
|  |     }).toThrowError('Test error'); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   it('can handle multiple errors', () => { | ||||||
|  |     const taskRunner = TaskRunnerFake.createFake(); | ||||||
|  |     taskRunner.enqueueError('Test error 1'); | ||||||
|  |     taskRunner.enqueueError('Test error 2'); | ||||||
|  | 
 | ||||||
|  |     expect(() => { | ||||||
|  |       taskRunner.setGraph(new Uint8Array(0), /* isBinary= */ true); | ||||||
|  |     }).toThrowError(/Test error 1, Test error 2/); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										113
									
								
								mediapipe/tasks/web/core/task_runner_test_utils.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								mediapipe/tasks/web/core/task_runner_test_utils.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,113 @@ | ||||||
|  | /** | ||||||
|  |  * Copyright 2022 The MediaPipe Authors. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | import 'jasmine'; | ||||||
|  | 
 | ||||||
|  | import {CalculatorGraphConfig} from '../../../framework/calculator_pb'; | ||||||
|  | import {WasmModule} from '../../../web/graph_runner/graph_runner'; | ||||||
|  | import {WasmModuleRegisterModelResources} from '../../../web/graph_runner/register_model_resources_graph_service'; | ||||||
|  | 
 | ||||||
|  | type SpyWasmModuleInternal = WasmModule&WasmModuleRegisterModelResources; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Convenience type for our fake WasmModule for Jasmine testing. | ||||||
|  |  */ | ||||||
|  | export declare type SpyWasmModule = jasmine.SpyObj<SpyWasmModuleInternal>; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Factory function for creating a fake WasmModule for our Jasmine tests, | ||||||
|  |  * allowing our APIs to no longer rely on the Wasm layer so they can run tests | ||||||
|  |  * in pure JS/TS (and optionally spy on the calls). | ||||||
|  |  */ | ||||||
|  | export function createSpyWasmModule(): SpyWasmModule { | ||||||
|  |   return jasmine.createSpyObj<SpyWasmModuleInternal>([ | ||||||
|  |     '_setAutoRenderToScreen', 'stringToNewUTF8', '_attachProtoListener', | ||||||
|  |     '_attachProtoVectorListener', '_free', '_waitUntilIdle', | ||||||
|  |     '_addStringToInputStream', '_registerModelResourcesGraphService', | ||||||
|  |     '_configureAudio' | ||||||
|  |   ]); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Sets up our equality testing to use a custom float equality checking function | ||||||
|  |  * to avoid incorrect test results due to minor floating point inaccuracies. | ||||||
|  |  */ | ||||||
|  | export function addJasmineCustomFloatEqualityTester() { | ||||||
|  |   jasmine.addCustomEqualityTester((a, b) => {  // Custom float equality
 | ||||||
|  |     if (a === +a && b === +b && (a !== (a | 0) || b !== (b | 0))) { | ||||||
|  |       return Math.abs(a - b) < 5e-8; | ||||||
|  |     } | ||||||
|  |     return; | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** The minimum interface provided by a test fake. */ | ||||||
|  | export interface MediapipeTasksFake { | ||||||
|  |   graph: CalculatorGraphConfig|undefined; | ||||||
|  |   calculatorName: string; | ||||||
|  |   attachListenerSpies: jasmine.Spy[]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** An map of field paths to values */ | ||||||
|  | export type FieldPathToValue = [string[] | string, unknown]; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Verifies that the graph has been initialized and that it contains the | ||||||
|  |  * provided options. | ||||||
|  |  */ | ||||||
|  | export function verifyGraph( | ||||||
|  |     tasksFake: MediapipeTasksFake, | ||||||
|  |     expectedCalculatorOptions?: FieldPathToValue, | ||||||
|  |     expectedBaseOptions?: FieldPathToValue, | ||||||
|  |     ): void { | ||||||
|  |   expect(tasksFake.graph).toBeDefined(); | ||||||
|  |   expect(tasksFake.graph!.getNodeList().length).toBe(1); | ||||||
|  |   const node = tasksFake.graph!.getNodeList()[0].toObject(); | ||||||
|  |   expect(node).toEqual( | ||||||
|  |       jasmine.objectContaining({calculator: tasksFake.calculatorName})); | ||||||
|  | 
 | ||||||
|  |   if (expectedBaseOptions) { | ||||||
|  |     const [fieldPath, value] = expectedBaseOptions; | ||||||
|  |     let proto = (node.options as {ext: {baseOptions: unknown}}).ext.baseOptions; | ||||||
|  |     for (const fieldName of ( | ||||||
|  |              Array.isArray(fieldPath) ? fieldPath : [fieldPath])) { | ||||||
|  |       proto = ((proto ?? {}) as Record<string, unknown>)[fieldName]; | ||||||
|  |     } | ||||||
|  |     expect(proto).toEqual(value); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   if (expectedCalculatorOptions) { | ||||||
|  |     const [fieldPath, value] = expectedCalculatorOptions; | ||||||
|  |     let proto = (node.options as {ext: unknown}).ext; | ||||||
|  |     for (const fieldName of ( | ||||||
|  |              Array.isArray(fieldPath) ? fieldPath : [fieldPath])) { | ||||||
|  |       proto = ((proto ?? {}) as Record<string, unknown>)[fieldName]; | ||||||
|  |     } | ||||||
|  |     expect(proto).toEqual(value); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Verifies all listeners (as exposed by `.attachListenerSpies`) have been | ||||||
|  |  * attached at least once since the last call to `verifyListenersRegistered()`. | ||||||
|  |  * This helps us to ensure that listeners are re-registered with every graph | ||||||
|  |  * update. | ||||||
|  |  */ | ||||||
|  | export function verifyListenersRegistered(tasksFake: MediapipeTasksFake): void { | ||||||
|  |   for (const spy of tasksFake.attachListenerSpies) { | ||||||
|  |     expect(spy.calls.count()).toBeGreaterThanOrEqual(1); | ||||||
|  |     spy.calls.reset(); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -3,14 +3,19 @@ | ||||||
|   "version": "0.0.0-alphga", |   "version": "0.0.0-alphga", | ||||||
|   "description": "MediaPipe GitHub repo", |   "description": "MediaPipe GitHub repo", | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|  |     "@bazel/jasmine": "^5.7.2", | ||||||
|     "@bazel/rollup": "^5.7.1", |     "@bazel/rollup": "^5.7.1", | ||||||
|     "@bazel/typescript": "^5.7.1", |     "@bazel/typescript": "^5.7.1", | ||||||
|     "@rollup/plugin-commonjs": "^23.0.2", |     "@rollup/plugin-commonjs": "^23.0.2", | ||||||
|     "@rollup/plugin-node-resolve": "^15.0.1", |     "@rollup/plugin-node-resolve": "^15.0.1", | ||||||
|     "@rollup/plugin-terser": "^0.1.0", |     "@rollup/plugin-terser": "^0.1.0", | ||||||
|     "@types/google-protobuf": "^3.15.6", |     "@types/google-protobuf": "^3.15.6", | ||||||
|  |     "@types/jasmine": "^4.3.1", | ||||||
|  |     "@types/node": "^18.11.11", | ||||||
|     "@types/offscreencanvas": "^2019.7.0", |     "@types/offscreencanvas": "^2019.7.0", | ||||||
|     "google-protobuf": "^3.21.2", |     "google-protobuf": "^3.21.2", | ||||||
|  |     "jasmine": "^4.5.0", | ||||||
|  |     "jasmine-core": "^4.5.0", | ||||||
|     "protobufjs": "^7.1.2", |     "protobufjs": "^7.1.2", | ||||||
|     "protobufjs-cli": "^1.0.2", |     "protobufjs-cli": "^1.0.2", | ||||||
|     "rollup": "^2.3.0", |     "rollup": "^2.3.0", | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
|     "inlineSourceMap": true, |     "inlineSourceMap": true, | ||||||
|     "inlineSources": true, |     "inlineSources": true, | ||||||
|     "strict": true, |     "strict": true, | ||||||
|     "types": ["@types/offscreencanvas"], |     "types": ["@types/offscreencanvas", "@types/jasmine", "node"], | ||||||
|     "rootDirs": [ |     "rootDirs": [ | ||||||
|       ".", |       ".", | ||||||
|       "./bazel-out/host/bin", |       "./bazel-out/host/bin", | ||||||
|  |  | ||||||
							
								
								
									
										419
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										419
									
								
								yarn.lock
									
									
									
									
									
								
							|  | @ -3,34 +3,52 @@ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| "@babel/parser@^7.9.4": | "@babel/parser@^7.9.4": | ||||||
|   version "7.20.3" |   version "7.20.5" | ||||||
|   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" |   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" | ||||||
|   integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== |   integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== | ||||||
|  | 
 | ||||||
|  | "@bazel/jasmine@^5.7.2": | ||||||
|  |   version "5.7.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/@bazel/jasmine/-/jasmine-5.7.2.tgz#438f272e66e939106cbdd58db709cd6aa008131b" | ||||||
|  |   integrity sha512-RJruOB6S9e0efTNIE2JVdaslguUXh5KcmLUCq/xLCt0zENP44ssp9OooDIrZ8H+Sp4mLDNBX7CMMA9WTsbsxTQ== | ||||||
|  |   dependencies: | ||||||
|  |     c8 "~7.5.0" | ||||||
|  |     jasmine-reporters "~2.5.0" | ||||||
| 
 | 
 | ||||||
| "@bazel/rollup@^5.7.1": | "@bazel/rollup@^5.7.1": | ||||||
|   version "5.7.1" |   version "5.7.2" | ||||||
|   resolved "https://registry.yarnpkg.com/@bazel/rollup/-/rollup-5.7.1.tgz#6f644c2d493a5bd9cd3724a6f239e609585c6e37" |   resolved "https://registry.yarnpkg.com/@bazel/rollup/-/rollup-5.7.2.tgz#9953b06e3de52794791cee4f89540c263b035fcf" | ||||||
|   integrity sha512-LLNogoK2Qx9GIJVywQ+V/czjud8236mnaRX//g7qbOyXoWZDQvAEgsxRHq+lS/XX9USbh+zJJlfb+Dfp/PXx4A== |   integrity sha512-yGWLheSKdMnJ/Y3/qg+zCDx/qkD04FBFp+BjRS8xP4yvlz9G4rW3zc45VzHHz3oOywgQaY1vhfKuZMCcjTGEyA== | ||||||
|   dependencies: |   dependencies: | ||||||
|     "@bazel/worker" "5.7.1" |     "@bazel/worker" "5.7.2" | ||||||
| 
 | 
 | ||||||
| "@bazel/typescript@^5.7.1": | "@bazel/typescript@^5.7.1": | ||||||
|   version "5.7.1" |   version "5.7.2" | ||||||
|   resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-5.7.1.tgz#e585bcdc54a4ccb23d99c3e1206abf4853cf0682" |   resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-5.7.2.tgz#a341215dc93ce28794e8430b311756816140bd78" | ||||||
|   integrity sha512-MAnAtFxA2znadm81+rbYXcyWX1DEF/urzZ1F4LBq+w27EQ4PGyqIqCM5om7JcoSZJwjjMoBJc3SflRsMrZZ6+g== |   integrity sha512-tarBJBEIirnq/YaeYu18vXcDxjzlq4xhCXvXUxA0lhHX5oArjEcAEn4tmO0jF+t/7cbkAdMT7daG6vIHSz0QAA== | ||||||
|   dependencies: |   dependencies: | ||||||
|     "@bazel/worker" "5.7.1" |     "@bazel/worker" "5.7.2" | ||||||
|     semver "5.6.0" |     semver "5.6.0" | ||||||
|     source-map-support "0.5.9" |     source-map-support "0.5.9" | ||||||
|     tsutils "3.21.0" |     tsutils "3.21.0" | ||||||
| 
 | 
 | ||||||
| "@bazel/worker@5.7.1": | "@bazel/worker@5.7.2": | ||||||
|   version "5.7.1" |   version "5.7.2" | ||||||
|   resolved "https://registry.yarnpkg.com/@bazel/worker/-/worker-5.7.1.tgz#2c4a9bd0e0ef75e496aec9599ff64a87307e7dad" |   resolved "https://registry.yarnpkg.com/@bazel/worker/-/worker-5.7.2.tgz#43d800dc1b5a3707340a4eb0102da81c53fc6f63" | ||||||
|   integrity sha512-UndmQVRqK0t0NMNl8I1P5XmxzdPvMA0X6jufszpfwy5gyzjOxeiOIzmC0ALCOx78CuJqOB/8WOI1pwTRmhd0tg== |   integrity sha512-H+auDA0QKF4mtZxKkZ2OKJvD7hGXVsVKtvcf4lbb93ur0ldpb5k810PcDxngmIGBcIX5kmyxniNTIiGFNobWTg== | ||||||
|   dependencies: |   dependencies: | ||||||
|     google-protobuf "^3.6.1" |     google-protobuf "^3.6.1" | ||||||
| 
 | 
 | ||||||
|  | "@bcoe/v8-coverage@^0.2.3": | ||||||
|  |   version "0.2.3" | ||||||
|  |   resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" | ||||||
|  |   integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== | ||||||
|  | 
 | ||||||
|  | "@istanbuljs/schema@^0.1.2": | ||||||
|  |   version "0.1.3" | ||||||
|  |   resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" | ||||||
|  |   integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== | ||||||
|  | 
 | ||||||
| "@jridgewell/gen-mapping@^0.3.0": | "@jridgewell/gen-mapping@^0.3.0": | ||||||
|   version "0.3.2" |   version "0.3.2" | ||||||
|   resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" |   resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" | ||||||
|  | @ -125,9 +143,9 @@ | ||||||
|   integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== |   integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== | ||||||
| 
 | 
 | ||||||
| "@rollup/plugin-commonjs@^23.0.2": | "@rollup/plugin-commonjs@^23.0.2": | ||||||
|   version "23.0.2" |   version "23.0.3" | ||||||
|   resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.2.tgz#3a3a5b7b1b1cb29037eb4992edcaae997d7ebd92" |   resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.3.tgz#442cd8ccca1b7563a503da86fc84a1a7112b54bb" | ||||||
|   integrity sha512-e9ThuiRf93YlVxc4qNIurvv+Hp9dnD+4PjOqQs5vAYfcZ3+AXSrcdzXnVjWxcGQOa6KGJFcRZyUI3ktWLavFjg== |   integrity sha512-31HxrT5emGfTyIfAs1lDQHj6EfYxTXcwtX5pIIhq+B/xZBNIqQ179d/CkYxlpYmFCxT78AeU4M8aL8Iv/IBxFA== | ||||||
|   dependencies: |   dependencies: | ||||||
|     "@rollup/pluginutils" "^5.0.1" |     "@rollup/pluginutils" "^5.0.1" | ||||||
|     commondir "^1.0.1" |     commondir "^1.0.1" | ||||||
|  | @ -174,6 +192,21 @@ | ||||||
|   resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz#674a69493ef2c849b95eafe69167ea59079eb504" |   resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz#674a69493ef2c849b95eafe69167ea59079eb504" | ||||||
|   integrity sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw== |   integrity sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw== | ||||||
| 
 | 
 | ||||||
|  | "@types/is-windows@^1.0.0": | ||||||
|  |   version "1.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/@types/is-windows/-/is-windows-1.0.0.tgz#1011fa129d87091e2f6faf9042d6704cdf2e7be0" | ||||||
|  |   integrity sha512-tJ1rq04tGKuIJoWIH0Gyuwv4RQ3+tIu7wQrC0MV47raQ44kIzXSSFKfrxFUOWVRvesoF7mrTqigXmqoZJsXwTg== | ||||||
|  | 
 | ||||||
|  | "@types/istanbul-lib-coverage@^2.0.1": | ||||||
|  |   version "2.0.4" | ||||||
|  |   resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" | ||||||
|  |   integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== | ||||||
|  | 
 | ||||||
|  | "@types/jasmine@^4.3.1": | ||||||
|  |   version "4.3.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-4.3.1.tgz#2d8ab5601c2fe7d9673dcb157e03f128ab5c5fff" | ||||||
|  |   integrity sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ== | ||||||
|  | 
 | ||||||
| "@types/linkify-it@*": | "@types/linkify-it@*": | ||||||
|   version "3.0.2" |   version "3.0.2" | ||||||
|   resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" |   resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" | ||||||
|  | @ -192,10 +225,10 @@ | ||||||
|   resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" |   resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" | ||||||
|   integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== |   integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== | ||||||
| 
 | 
 | ||||||
| "@types/node@>=13.7.0": | "@types/node@>=13.7.0", "@types/node@^18.11.11": | ||||||
|   version "18.11.9" |   version "18.11.11" | ||||||
|   resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" |   resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.11.tgz#1d455ac0211549a8409d3cdb371cd55cc971e8dc" | ||||||
|   integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== |   integrity sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g== | ||||||
| 
 | 
 | ||||||
| "@types/offscreencanvas@^2019.7.0": | "@types/offscreencanvas@^2019.7.0": | ||||||
|   version "2019.7.0" |   version "2019.7.0" | ||||||
|  | @ -207,6 +240,11 @@ | ||||||
|   resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" |   resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" | ||||||
|   integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== |   integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== | ||||||
| 
 | 
 | ||||||
|  | "@xmldom/xmldom@^0.8.5": | ||||||
|  |   version "0.8.6" | ||||||
|  |   resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440" | ||||||
|  |   integrity sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg== | ||||||
|  | 
 | ||||||
| acorn-jsx@^5.3.2: | acorn-jsx@^5.3.2: | ||||||
|   version "5.3.2" |   version "5.3.2" | ||||||
|   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" |   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" | ||||||
|  | @ -217,7 +255,12 @@ acorn@^8.5.0, acorn@^8.8.0: | ||||||
|   resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" |   resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" | ||||||
|   integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== |   integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== | ||||||
| 
 | 
 | ||||||
| ansi-styles@^4.1.0: | ansi-regex@^5.0.1: | ||||||
|  |   version "5.0.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" | ||||||
|  |   integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== | ||||||
|  | 
 | ||||||
|  | ansi-styles@^4.0.0, ansi-styles@^4.1.0: | ||||||
|   version "4.3.0" |   version "4.3.0" | ||||||
|   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" |   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" | ||||||
|   integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== |   integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== | ||||||
|  | @ -264,6 +307,25 @@ builtin-modules@^3.3.0: | ||||||
|   resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" |   resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" | ||||||
|   integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== |   integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== | ||||||
| 
 | 
 | ||||||
|  | c8@~7.5.0: | ||||||
|  |   version "7.5.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/c8/-/c8-7.5.0.tgz#a69439ab82848f344a74bb25dc5dd4e867764481" | ||||||
|  |   integrity sha512-GSkLsbvDr+FIwjNSJ8OwzWAyuznEYGTAd1pzb/Kr0FMLuV4vqYJTyjboDTwmlUNAG6jAU3PFWzqIdKrOt1D8tw== | ||||||
|  |   dependencies: | ||||||
|  |     "@bcoe/v8-coverage" "^0.2.3" | ||||||
|  |     "@istanbuljs/schema" "^0.1.2" | ||||||
|  |     find-up "^5.0.0" | ||||||
|  |     foreground-child "^2.0.0" | ||||||
|  |     furi "^2.0.0" | ||||||
|  |     istanbul-lib-coverage "^3.0.0" | ||||||
|  |     istanbul-lib-report "^3.0.0" | ||||||
|  |     istanbul-reports "^3.0.2" | ||||||
|  |     rimraf "^3.0.0" | ||||||
|  |     test-exclude "^6.0.0" | ||||||
|  |     v8-to-istanbul "^7.1.0" | ||||||
|  |     yargs "^16.0.0" | ||||||
|  |     yargs-parser "^20.0.0" | ||||||
|  | 
 | ||||||
| catharsis@^0.9.0: | catharsis@^0.9.0: | ||||||
|   version "0.9.0" |   version "0.9.0" | ||||||
|   resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" |   resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" | ||||||
|  | @ -279,6 +341,15 @@ chalk@^4.0.0: | ||||||
|     ansi-styles "^4.1.0" |     ansi-styles "^4.1.0" | ||||||
|     supports-color "^7.1.0" |     supports-color "^7.1.0" | ||||||
| 
 | 
 | ||||||
|  | cliui@^7.0.2: | ||||||
|  |   version "7.0.4" | ||||||
|  |   resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" | ||||||
|  |   integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== | ||||||
|  |   dependencies: | ||||||
|  |     string-width "^4.2.0" | ||||||
|  |     strip-ansi "^6.0.0" | ||||||
|  |     wrap-ansi "^7.0.0" | ||||||
|  | 
 | ||||||
| color-convert@^2.0.1: | color-convert@^2.0.1: | ||||||
|   version "2.0.1" |   version "2.0.1" | ||||||
|   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" |   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" | ||||||
|  | @ -306,6 +377,20 @@ concat-map@0.0.1: | ||||||
|   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" |   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" | ||||||
|   integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== |   integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== | ||||||
| 
 | 
 | ||||||
|  | convert-source-map@^1.6.0: | ||||||
|  |   version "1.9.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" | ||||||
|  |   integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== | ||||||
|  | 
 | ||||||
|  | cross-spawn@^7.0.0: | ||||||
|  |   version "7.0.3" | ||||||
|  |   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" | ||||||
|  |   integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== | ||||||
|  |   dependencies: | ||||||
|  |     path-key "^3.1.0" | ||||||
|  |     shebang-command "^2.0.0" | ||||||
|  |     which "^2.0.1" | ||||||
|  | 
 | ||||||
| deep-is@~0.1.3: | deep-is@~0.1.3: | ||||||
|   version "0.1.4" |   version "0.1.4" | ||||||
|   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" |   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" | ||||||
|  | @ -316,11 +401,21 @@ deepmerge@^4.2.2: | ||||||
|   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" |   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" | ||||||
|   integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== |   integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== | ||||||
| 
 | 
 | ||||||
|  | emoji-regex@^8.0.0: | ||||||
|  |   version "8.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" | ||||||
|  |   integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== | ||||||
|  | 
 | ||||||
| entities@~2.1.0: | entities@~2.1.0: | ||||||
|   version "2.1.0" |   version "2.1.0" | ||||||
|   resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" |   resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" | ||||||
|   integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== |   integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== | ||||||
| 
 | 
 | ||||||
|  | escalade@^3.1.1: | ||||||
|  |   version "3.1.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" | ||||||
|  |   integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== | ||||||
|  | 
 | ||||||
| escape-string-regexp@^2.0.0: | escape-string-regexp@^2.0.0: | ||||||
|   version "2.0.0" |   version "2.0.0" | ||||||
|   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" |   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" | ||||||
|  | @ -382,6 +477,22 @@ fast-levenshtein@~2.0.6: | ||||||
|   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" |   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" | ||||||
|   integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== |   integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== | ||||||
| 
 | 
 | ||||||
|  | find-up@^5.0.0: | ||||||
|  |   version "5.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" | ||||||
|  |   integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== | ||||||
|  |   dependencies: | ||||||
|  |     locate-path "^6.0.0" | ||||||
|  |     path-exists "^4.0.0" | ||||||
|  | 
 | ||||||
|  | foreground-child@^2.0.0: | ||||||
|  |   version "2.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" | ||||||
|  |   integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== | ||||||
|  |   dependencies: | ||||||
|  |     cross-spawn "^7.0.0" | ||||||
|  |     signal-exit "^3.0.2" | ||||||
|  | 
 | ||||||
| fs.realpath@^1.0.0: | fs.realpath@^1.0.0: | ||||||
|   version "1.0.0" |   version "1.0.0" | ||||||
|   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" |   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" | ||||||
|  | @ -397,7 +508,20 @@ function-bind@^1.1.1: | ||||||
|   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" |   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" | ||||||
|   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== |   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== | ||||||
| 
 | 
 | ||||||
| glob@^7.1.3: | furi@^2.0.0: | ||||||
|  |   version "2.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/furi/-/furi-2.0.0.tgz#13d85826a1af21acc691da6254b3888fc39f0b4a" | ||||||
|  |   integrity sha512-uKuNsaU0WVaK/vmvj23wW1bicOFfyqSsAIH71bRZx8kA4Xj+YCHin7CJKJJjkIsmxYaPFLk9ljmjEyB7xF7WvQ== | ||||||
|  |   dependencies: | ||||||
|  |     "@types/is-windows" "^1.0.0" | ||||||
|  |     is-windows "^1.0.2" | ||||||
|  | 
 | ||||||
|  | get-caller-file@^2.0.5: | ||||||
|  |   version "2.0.5" | ||||||
|  |   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" | ||||||
|  |   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== | ||||||
|  | 
 | ||||||
|  | glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: | ||||||
|   version "7.2.3" |   version "7.2.3" | ||||||
|   resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" |   resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" | ||||||
|   integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== |   integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== | ||||||
|  | @ -442,6 +566,11 @@ has@^1.0.3: | ||||||
|   dependencies: |   dependencies: | ||||||
|     function-bind "^1.1.1" |     function-bind "^1.1.1" | ||||||
| 
 | 
 | ||||||
|  | html-escaper@^2.0.0: | ||||||
|  |   version "2.0.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" | ||||||
|  |   integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== | ||||||
|  | 
 | ||||||
| inflight@^1.0.4: | inflight@^1.0.4: | ||||||
|   version "1.0.6" |   version "1.0.6" | ||||||
|   resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" |   resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" | ||||||
|  | @ -469,6 +598,11 @@ is-core-module@^2.9.0: | ||||||
|   dependencies: |   dependencies: | ||||||
|     has "^1.0.3" |     has "^1.0.3" | ||||||
| 
 | 
 | ||||||
|  | is-fullwidth-code-point@^3.0.0: | ||||||
|  |   version "3.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" | ||||||
|  |   integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== | ||||||
|  | 
 | ||||||
| is-module@^1.0.0: | is-module@^1.0.0: | ||||||
|   version "1.0.0" |   version "1.0.0" | ||||||
|   resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" |   resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" | ||||||
|  | @ -481,6 +615,59 @@ is-reference@1.2.1: | ||||||
|   dependencies: |   dependencies: | ||||||
|     "@types/estree" "*" |     "@types/estree" "*" | ||||||
| 
 | 
 | ||||||
|  | is-windows@^1.0.2: | ||||||
|  |   version "1.0.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" | ||||||
|  |   integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== | ||||||
|  | 
 | ||||||
|  | isexe@^2.0.0: | ||||||
|  |   version "2.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" | ||||||
|  |   integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== | ||||||
|  | 
 | ||||||
|  | istanbul-lib-coverage@^3.0.0: | ||||||
|  |   version "3.2.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" | ||||||
|  |   integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== | ||||||
|  | 
 | ||||||
|  | istanbul-lib-report@^3.0.0: | ||||||
|  |   version "3.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" | ||||||
|  |   integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== | ||||||
|  |   dependencies: | ||||||
|  |     istanbul-lib-coverage "^3.0.0" | ||||||
|  |     make-dir "^3.0.0" | ||||||
|  |     supports-color "^7.1.0" | ||||||
|  | 
 | ||||||
|  | istanbul-reports@^3.0.2: | ||||||
|  |   version "3.1.5" | ||||||
|  |   resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" | ||||||
|  |   integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== | ||||||
|  |   dependencies: | ||||||
|  |     html-escaper "^2.0.0" | ||||||
|  |     istanbul-lib-report "^3.0.0" | ||||||
|  | 
 | ||||||
|  | jasmine-core@^4.5.0: | ||||||
|  |   version "4.5.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.5.0.tgz#1a6bd0bde3f60996164311c88a0995d67ceda7c3" | ||||||
|  |   integrity sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw== | ||||||
|  | 
 | ||||||
|  | jasmine-reporters@~2.5.0: | ||||||
|  |   version "2.5.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.5.2.tgz#b5dfa1d9c40b8020c5225e0e1e2b9953d66a4d69" | ||||||
|  |   integrity sha512-qdewRUuFOSiWhiyWZX8Yx3YNQ9JG51ntBEO4ekLQRpktxFTwUHy24a86zD/Oi2BRTKksEdfWQZcQFqzjqIkPig== | ||||||
|  |   dependencies: | ||||||
|  |     "@xmldom/xmldom" "^0.8.5" | ||||||
|  |     mkdirp "^1.0.4" | ||||||
|  | 
 | ||||||
|  | jasmine@^4.5.0: | ||||||
|  |   version "4.5.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-4.5.0.tgz#8d3c0d0a33a61e4d05c9f9747ee5dfaf6f7b5d3d" | ||||||
|  |   integrity sha512-9olGRvNZyADIwYL9XBNBst5BTU/YaePzuddK+YRslc7rI9MdTIE4r3xaBKbv2GEmzYYUfMOdTR8/i6JfLZaxSQ== | ||||||
|  |   dependencies: | ||||||
|  |     glob "^7.1.6" | ||||||
|  |     jasmine-core "^4.5.0" | ||||||
|  | 
 | ||||||
| js2xmlparser@^4.0.2: | js2xmlparser@^4.0.2: | ||||||
|   version "4.0.2" |   version "4.0.2" | ||||||
|   resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" |   resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" | ||||||
|  | @ -531,7 +718,14 @@ linkify-it@^3.0.1: | ||||||
|   dependencies: |   dependencies: | ||||||
|     uc.micro "^1.0.1" |     uc.micro "^1.0.1" | ||||||
| 
 | 
 | ||||||
| lodash@^4.17.14, lodash@^4.17.15: | locate-path@^6.0.0: | ||||||
|  |   version "6.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" | ||||||
|  |   integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== | ||||||
|  |   dependencies: | ||||||
|  |     p-locate "^5.0.0" | ||||||
|  | 
 | ||||||
|  | lodash@^4.17.15, lodash@^4.17.21: | ||||||
|   version "4.17.21" |   version "4.17.21" | ||||||
|   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" |   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" | ||||||
|   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== |   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== | ||||||
|  | @ -555,6 +749,13 @@ magic-string@^0.26.4: | ||||||
|   dependencies: |   dependencies: | ||||||
|     sourcemap-codec "^1.4.8" |     sourcemap-codec "^1.4.8" | ||||||
| 
 | 
 | ||||||
|  | make-dir@^3.0.0: | ||||||
|  |   version "3.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" | ||||||
|  |   integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== | ||||||
|  |   dependencies: | ||||||
|  |     semver "^6.0.0" | ||||||
|  | 
 | ||||||
| markdown-it-anchor@^8.4.1: | markdown-it-anchor@^8.4.1: | ||||||
|   version "8.6.5" |   version "8.6.5" | ||||||
|   resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz#30c4bc5bbff327f15ce3c429010ec7ba75e7b5f8" |   resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz#30c4bc5bbff327f15ce3c429010ec7ba75e7b5f8" | ||||||
|  | @ -572,16 +773,16 @@ markdown-it@^12.3.2: | ||||||
|     uc.micro "^1.0.5" |     uc.micro "^1.0.5" | ||||||
| 
 | 
 | ||||||
| marked@^4.0.10: | marked@^4.0.10: | ||||||
|   version "4.2.2" |   version "4.2.3" | ||||||
|   resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.2.tgz#1d2075ad6cdfe42e651ac221c32d949a26c0672a" |   resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.3.tgz#bd76a5eb510ff1d8421bc6c3b2f0b93488c15bea" | ||||||
|   integrity sha512-JjBTFTAvuTgANXx82a5vzK9JLSMoV6V3LBVn4Uhdso6t7vXrGx7g1Cd2r6NYSsxrYbQGFCMqBDhFHyK5q2UvcQ== |   integrity sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw== | ||||||
| 
 | 
 | ||||||
| mdurl@^1.0.1: | mdurl@^1.0.1: | ||||||
|   version "1.0.1" |   version "1.0.1" | ||||||
|   resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" |   resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" | ||||||
|   integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== |   integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== | ||||||
| 
 | 
 | ||||||
| minimatch@^3.1.1: | minimatch@^3.0.4, minimatch@^3.1.1: | ||||||
|   version "3.1.2" |   version "3.1.2" | ||||||
|   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" |   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" | ||||||
|   integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== |   integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== | ||||||
|  | @ -589,9 +790,9 @@ minimatch@^3.1.1: | ||||||
|     brace-expansion "^1.1.7" |     brace-expansion "^1.1.7" | ||||||
| 
 | 
 | ||||||
| minimatch@^5.0.1: | minimatch@^5.0.1: | ||||||
|   version "5.1.0" |   version "5.1.1" | ||||||
|   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" |   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.1.tgz#6c9dffcf9927ff2a31e74b5af11adf8b9604b022" | ||||||
|   integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== |   integrity sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g== | ||||||
|   dependencies: |   dependencies: | ||||||
|     brace-expansion "^2.0.1" |     brace-expansion "^2.0.1" | ||||||
| 
 | 
 | ||||||
|  | @ -624,11 +825,35 @@ optionator@^0.8.1: | ||||||
|     type-check "~0.3.2" |     type-check "~0.3.2" | ||||||
|     word-wrap "~1.2.3" |     word-wrap "~1.2.3" | ||||||
| 
 | 
 | ||||||
|  | p-limit@^3.0.2: | ||||||
|  |   version "3.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" | ||||||
|  |   integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== | ||||||
|  |   dependencies: | ||||||
|  |     yocto-queue "^0.1.0" | ||||||
|  | 
 | ||||||
|  | p-locate@^5.0.0: | ||||||
|  |   version "5.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" | ||||||
|  |   integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== | ||||||
|  |   dependencies: | ||||||
|  |     p-limit "^3.0.2" | ||||||
|  | 
 | ||||||
|  | path-exists@^4.0.0: | ||||||
|  |   version "4.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" | ||||||
|  |   integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== | ||||||
|  | 
 | ||||||
| path-is-absolute@^1.0.0: | path-is-absolute@^1.0.0: | ||||||
|   version "1.0.1" |   version "1.0.1" | ||||||
|   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" |   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" | ||||||
|   integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== |   integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== | ||||||
| 
 | 
 | ||||||
|  | path-key@^3.1.0: | ||||||
|  |   version "3.1.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" | ||||||
|  |   integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== | ||||||
|  | 
 | ||||||
| path-parse@^1.0.7: | path-parse@^1.0.7: | ||||||
|   version "1.0.7" |   version "1.0.7" | ||||||
|   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" |   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" | ||||||
|  | @ -678,12 +903,17 @@ protobufjs@^7.1.2: | ||||||
|     "@types/node" ">=13.7.0" |     "@types/node" ">=13.7.0" | ||||||
|     long "^5.0.0" |     long "^5.0.0" | ||||||
| 
 | 
 | ||||||
|  | require-directory@^2.1.1: | ||||||
|  |   version "2.1.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" | ||||||
|  |   integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== | ||||||
|  | 
 | ||||||
| requizzle@^0.2.3: | requizzle@^0.2.3: | ||||||
|   version "0.2.3" |   version "0.2.4" | ||||||
|   resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" |   resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.4.tgz#319eb658b28c370f0c20f968fa8ceab98c13d27c" | ||||||
|   integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== |   integrity sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw== | ||||||
|   dependencies: |   dependencies: | ||||||
|     lodash "^4.17.14" |     lodash "^4.17.21" | ||||||
| 
 | 
 | ||||||
| resolve@^1.22.1: | resolve@^1.22.1: | ||||||
|   version "1.22.1" |   version "1.22.1" | ||||||
|  | @ -713,6 +943,11 @@ semver@5.6.0: | ||||||
|   resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" |   resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" | ||||||
|   integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== |   integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== | ||||||
| 
 | 
 | ||||||
|  | semver@^6.0.0: | ||||||
|  |   version "6.3.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" | ||||||
|  |   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== | ||||||
|  | 
 | ||||||
| semver@^7.1.2: | semver@^7.1.2: | ||||||
|   version "7.3.8" |   version "7.3.8" | ||||||
|   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" |   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" | ||||||
|  | @ -720,6 +955,23 @@ semver@^7.1.2: | ||||||
|   dependencies: |   dependencies: | ||||||
|     lru-cache "^6.0.0" |     lru-cache "^6.0.0" | ||||||
| 
 | 
 | ||||||
|  | shebang-command@^2.0.0: | ||||||
|  |   version "2.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" | ||||||
|  |   integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== | ||||||
|  |   dependencies: | ||||||
|  |     shebang-regex "^3.0.0" | ||||||
|  | 
 | ||||||
|  | shebang-regex@^3.0.0: | ||||||
|  |   version "3.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" | ||||||
|  |   integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== | ||||||
|  | 
 | ||||||
|  | signal-exit@^3.0.2: | ||||||
|  |   version "3.0.7" | ||||||
|  |   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" | ||||||
|  |   integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== | ||||||
|  | 
 | ||||||
| source-map-support@0.5.9: | source-map-support@0.5.9: | ||||||
|   version "0.5.9" |   version "0.5.9" | ||||||
|   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" |   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" | ||||||
|  | @ -741,11 +993,32 @@ source-map@^0.6.0, source-map@~0.6.1: | ||||||
|   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" |   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" | ||||||
|   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== |   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== | ||||||
| 
 | 
 | ||||||
|  | source-map@^0.7.3: | ||||||
|  |   version "0.7.4" | ||||||
|  |   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" | ||||||
|  |   integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== | ||||||
|  | 
 | ||||||
| sourcemap-codec@^1.4.8: | sourcemap-codec@^1.4.8: | ||||||
|   version "1.4.8" |   version "1.4.8" | ||||||
|   resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" |   resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" | ||||||
|   integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== |   integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== | ||||||
| 
 | 
 | ||||||
|  | string-width@^4.1.0, string-width@^4.2.0: | ||||||
|  |   version "4.2.3" | ||||||
|  |   resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" | ||||||
|  |   integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== | ||||||
|  |   dependencies: | ||||||
|  |     emoji-regex "^8.0.0" | ||||||
|  |     is-fullwidth-code-point "^3.0.0" | ||||||
|  |     strip-ansi "^6.0.1" | ||||||
|  | 
 | ||||||
|  | strip-ansi@^6.0.0, strip-ansi@^6.0.1: | ||||||
|  |   version "6.0.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" | ||||||
|  |   integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== | ||||||
|  |   dependencies: | ||||||
|  |     ansi-regex "^5.0.1" | ||||||
|  | 
 | ||||||
| strip-json-comments@^3.1.0: | strip-json-comments@^3.1.0: | ||||||
|   version "3.1.1" |   version "3.1.1" | ||||||
|   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" |   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" | ||||||
|  | @ -769,15 +1042,24 @@ taffydb@2.6.2: | ||||||
|   integrity sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA== |   integrity sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA== | ||||||
| 
 | 
 | ||||||
| terser@^5.15.1: | terser@^5.15.1: | ||||||
|   version "5.15.1" |   version "5.16.1" | ||||||
|   resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" |   resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" | ||||||
|   integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== |   integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== | ||||||
|   dependencies: |   dependencies: | ||||||
|     "@jridgewell/source-map" "^0.3.2" |     "@jridgewell/source-map" "^0.3.2" | ||||||
|     acorn "^8.5.0" |     acorn "^8.5.0" | ||||||
|     commander "^2.20.0" |     commander "^2.20.0" | ||||||
|     source-map-support "~0.5.20" |     source-map-support "~0.5.20" | ||||||
| 
 | 
 | ||||||
|  | test-exclude@^6.0.0: | ||||||
|  |   version "6.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" | ||||||
|  |   integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== | ||||||
|  |   dependencies: | ||||||
|  |     "@istanbuljs/schema" "^0.1.2" | ||||||
|  |     glob "^7.1.4" | ||||||
|  |     minimatch "^3.0.4" | ||||||
|  | 
 | ||||||
| tmp@^0.2.1: | tmp@^0.2.1: | ||||||
|   version "0.2.1" |   version "0.2.1" | ||||||
|   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" |   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" | ||||||
|  | @ -812,9 +1094,9 @@ type-check@~0.3.2: | ||||||
|     prelude-ls "~1.1.2" |     prelude-ls "~1.1.2" | ||||||
| 
 | 
 | ||||||
| typescript@^4.8.4: | typescript@^4.8.4: | ||||||
|   version "4.8.4" |   version "4.9.3" | ||||||
|   resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" |   resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" | ||||||
|   integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== |   integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== | ||||||
| 
 | 
 | ||||||
| uc.micro@^1.0.1, uc.micro@^1.0.5: | uc.micro@^1.0.1, uc.micro@^1.0.5: | ||||||
|   version "1.0.6" |   version "1.0.6" | ||||||
|  | @ -831,11 +1113,36 @@ underscore@~1.13.2: | ||||||
|   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" |   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" | ||||||
|   integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== |   integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== | ||||||
| 
 | 
 | ||||||
|  | v8-to-istanbul@^7.1.0: | ||||||
|  |   version "7.1.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" | ||||||
|  |   integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== | ||||||
|  |   dependencies: | ||||||
|  |     "@types/istanbul-lib-coverage" "^2.0.1" | ||||||
|  |     convert-source-map "^1.6.0" | ||||||
|  |     source-map "^0.7.3" | ||||||
|  | 
 | ||||||
|  | which@^2.0.1: | ||||||
|  |   version "2.0.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" | ||||||
|  |   integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== | ||||||
|  |   dependencies: | ||||||
|  |     isexe "^2.0.0" | ||||||
|  | 
 | ||||||
| word-wrap@~1.2.3: | word-wrap@~1.2.3: | ||||||
|   version "1.2.3" |   version "1.2.3" | ||||||
|   resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" |   resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" | ||||||
|   integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== |   integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== | ||||||
| 
 | 
 | ||||||
|  | wrap-ansi@^7.0.0: | ||||||
|  |   version "7.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" | ||||||
|  |   integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== | ||||||
|  |   dependencies: | ||||||
|  |     ansi-styles "^4.0.0" | ||||||
|  |     string-width "^4.1.0" | ||||||
|  |     strip-ansi "^6.0.0" | ||||||
|  | 
 | ||||||
| wrappy@1: | wrappy@1: | ||||||
|   version "1.0.2" |   version "1.0.2" | ||||||
|   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" |   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" | ||||||
|  | @ -846,7 +1153,35 @@ xmlcreate@^2.0.4: | ||||||
|   resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" |   resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" | ||||||
|   integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== |   integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== | ||||||
| 
 | 
 | ||||||
|  | y18n@^5.0.5: | ||||||
|  |   version "5.0.8" | ||||||
|  |   resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" | ||||||
|  |   integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== | ||||||
|  | 
 | ||||||
| yallist@^4.0.0: | yallist@^4.0.0: | ||||||
|   version "4.0.0" |   version "4.0.0" | ||||||
|   resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" |   resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" | ||||||
|   integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== |   integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== | ||||||
|  | 
 | ||||||
|  | yargs-parser@^20.0.0, yargs-parser@^20.2.2: | ||||||
|  |   version "20.2.9" | ||||||
|  |   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" | ||||||
|  |   integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== | ||||||
|  | 
 | ||||||
|  | yargs@^16.0.0: | ||||||
|  |   version "16.2.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" | ||||||
|  |   integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== | ||||||
|  |   dependencies: | ||||||
|  |     cliui "^7.0.2" | ||||||
|  |     escalade "^3.1.1" | ||||||
|  |     get-caller-file "^2.0.5" | ||||||
|  |     require-directory "^2.1.1" | ||||||
|  |     string-width "^4.2.0" | ||||||
|  |     y18n "^5.0.5" | ||||||
|  |     yargs-parser "^20.2.2" | ||||||
|  | 
 | ||||||
|  | yocto-queue@^0.1.0: | ||||||
|  |   version "0.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" | ||||||
|  |   integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user