├── .npmignore ├── .travis.yml ├── .editorconfig ├── README.md ├── test ├── string.js ├── _utils.js ├── invoke.js ├── isEmpty.js ├── is.js └── length.js ├── package.json ├── .eslintrc.json ├── .vscode └── launch.json ├── LICENSE ├── .gitignore ├── index.js └── yarn.lock /.npmignore: -------------------------------------------------------------------------------- 1 | # ignore logs directory 2 | logs 3 | 4 | # ignore archived files 5 | *.tar 6 | *.tgz 7 | 8 | # vscode settings 9 | .vscode 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | # - '4' nodejs4 doesn't support destructuring 5 | - '6' 6 | - '8' 7 | - 'node' 8 | 9 | before_script: 10 | - npm install mocha -g 11 | 12 | notifications: 13 | email: false 14 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | end_of_line = lf 4 | tab_width = 4 5 | indent_size = 4 6 | indent_style = tab 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | [*.{html,htm,md,markdown}] 11 | trim_trailing_whitespace = false 12 | 13 | [*.{yaml,yml}] 14 | indent_style = space 15 | indent_size = 2 16 | tab_width = 2 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # assert 2 | 3 | [![Build Status](https://travis-ci.org/hangxingliu/node-assert.svg?branch=master)](https://travis-ci.org/hangxingliu/node-assert) 4 | 5 | An enhanced assert library for Node.js 6 | 7 | ## Install 8 | 9 | ``` bash 10 | npm install @hangxingliu/assert --save-dev 11 | ``` 12 | 13 | ## Author 14 | 15 | [Liu Yue](https://github.com/hangxingliu) 16 | 17 | ## License 18 | 19 | [MIT](LICENSE) 20 | -------------------------------------------------------------------------------- /test/string.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | let { Assert } = require('..'), 4 | { shouldThrow, noThrow } = require('./_utils'); 5 | 6 | describe('Assert String methods', () => { 7 | noThrow('# trim (1)', () => Assert(" HelloWorld ").trim().equals("HelloWorld")); 8 | noThrow("# trim (2)", () => Assert("").trim().equals("")); 9 | 10 | shouldThrow("# ! trim", () => Assert("0").trim().equals("")); 11 | 12 | it.skip('# TODO ...', () => { }); 13 | }); 14 | -------------------------------------------------------------------------------- /test/_utils.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | module.exports = { 4 | shouldThrow, 5 | noThrow 6 | }; 7 | 8 | /** 9 | * @param {string} name 10 | * @param {Function} fn 11 | */ 12 | function noThrow(name, fn) { 13 | it(name, () => fn()); 14 | } 15 | 16 | /** 17 | * @param {string} name 18 | * @param {Function} fn 19 | */ 20 | function shouldThrow(name, fn) { 21 | it(name, () => { 22 | try { 23 | fn(); 24 | } catch (exception) { 25 | return; 26 | } 27 | throw new Error(`expect a exception be thrown, but actual not`); 28 | }); 29 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@hangxingliu/assert", 3 | "version": "0.1.1", 4 | "description": "an enhanced assert library", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha test/*.js" 8 | }, 9 | "keywords": [ 10 | "assert", 11 | "test" 12 | ], 13 | "author": "Liu Yue", 14 | "license": "MIT", 15 | "devDependencies": { 16 | "@types/mocha": "^9.0.0", 17 | "@types/node": "^9.6.2", 18 | "mocha": "^9.1.3" 19 | }, 20 | "repository": { 21 | "type": "git", 22 | "url": "https://github.com/hangxingliu/node-assert" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es6": true, 6 | "node": true, 7 | "mocha": true 8 | }, 9 | "parserOptions": { 10 | "ecmaFeatures": { 11 | "jsx": true 12 | }, 13 | "sourceType": "module" 14 | }, 15 | "rules": { 16 | "no-const-assign": "warn", 17 | "no-this-before-super": "warn", 18 | "no-undef": "warn", 19 | "no-unreachable": "warn", 20 | "no-unused-vars": "warn", 21 | "constructor-super": "warn", 22 | "valid-typeof": "warn" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Mocha Tests", 11 | "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", 12 | "args": [ 13 | "-u", 14 | "tdd", 15 | "--timeout", 16 | "999999", 17 | "--colors", 18 | "${workspaceFolder}/test" 19 | ], 20 | "internalConsoleOptions": "openOnSessionStart" 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /test/invoke.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | let { Invoke } = require('..'), 4 | { shouldThrow, noThrow } = require('./_utils'); 5 | 6 | //@ts-ignore 7 | //eslint-disable-next-line 8 | let errorFn1 = () => a.b.c = 1; 9 | let okFn1 = () => 42; 10 | 11 | describe('Invoke', () => { 12 | 13 | noThrow('# should throw', () => Invoke(errorFn1).hasException()); 14 | noThrow('# should throw with keyword', () => Invoke(errorFn1).hasException('is not defined')); 15 | 16 | noThrow('# no throw', () => Invoke(okFn1).isNumber().equals(42)); 17 | 18 | shouldThrow('# ! should throw', () => Invoke(okFn1).hasException()); 19 | shouldThrow('# ! should throw with keyword', () => Invoke(errorFn1).hasException('is defined')); 20 | }); 21 | -------------------------------------------------------------------------------- /test/isEmpty.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | let { Assert } = require('..'), 4 | { shouldThrow, noThrow } = require('./_utils'); 5 | 6 | describe('Assert.isEmpty', () => { 7 | noThrow('# 0 isEmpty', () => Assert(0).isEmpty()); 8 | noThrow('# [] isEmpty', () => Assert([]).isEmpty()); 9 | noThrow('# "" isEmpty', () => Assert("").isEmpty()); 10 | noThrow('# null isEmpty', () => Assert(null).isEmpty()); 11 | noThrow('# undefined isEmpty', () => Assert(undefined).isEmpty()); 12 | 13 | 14 | shouldThrow('# ! {} isEmpty', () => Assert({}).isEmpty()); 15 | shouldThrow('# ! [0] isEmpty', () => Assert([0]).isEmpty()); 16 | shouldThrow('# ! " " isEmpty', () => Assert(" ").isEmpty()); 17 | shouldThrow('# ! String isEmpty', () => Assert(String).isEmpty()); 18 | shouldThrow('# ! Function isEmpty', () => Assert(Function).isEmpty()); 19 | shouldThrow('# ! function isEmpty', () => Assert(() => void 0).isEmpty()); 20 | }); 21 | -------------------------------------------------------------------------------- /test/is.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | let { Assert } = require('..'), 4 | { shouldThrow, noThrow } = require('./_utils'); 5 | 6 | describe('Assert.is', () => { 7 | noThrow('# true isTrue', () => Assert(true).isTrue()); 8 | noThrow('# false isFalse', () => Assert(false).isFalse()); 9 | 10 | noThrow('# undefined isUndefined (1)', () => Assert(undefined).isUndefined()); 11 | //@ts-ignore 12 | noThrow('# undefined isUndefined (2)', () => Assert().isUndefined()); 13 | 14 | noThrow('# "" isString', () => Assert("").isString()); 15 | 16 | noThrow('# 0 isNumber', () => Assert(0).isNumber()); 17 | noThrow('# Infinity isNumber', () => Assert(Infinity).isNumber()); 18 | 19 | noThrow('# [] isObject', () => Assert([]).isObject()); 20 | noThrow('# null isObject', () => Assert(null).isObject()); 21 | 22 | 23 | shouldThrow('# ! null isUndefined', () => Assert(null).isUndefined()); 24 | shouldThrow('# ! "hello" isObject', () => Assert("hello").isObject()); 25 | }); 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Liu Yue 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /test/length.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | let { Assert } = require('..'), 4 | { shouldThrow, noThrow } = require('./_utils'); 5 | 6 | describe('Assert.length', () => { 7 | noThrow('# [] length is 0', () => Assert([]).length(0)); 8 | noThrow('# "" length is 0', () => Assert("").length(0)); 9 | noThrow('# {length: 0} length is 0', () => Assert({ length: 0 }).length(0)); 10 | 11 | noThrow('# [1,2] length is 2', () => Assert([1, 2]).length(2)); 12 | noThrow('# "Hi" length is 2', () => Assert("Hi").length(2)); 13 | noThrow('# {length: 2} length is 2', () => Assert({ length: 2 }).length(2)); 14 | 15 | noThrow('# {i: 1, get length() { return this.i++;} } length is 1', () => 16 | Assert({ i: 1, get length() { return this.i++; } }).length(1)); 17 | 18 | shouldThrow('# ! 0 length is 0', () => Assert(0).length(0)); 19 | shouldThrow('# ! {} length is 0', () => Assert({}).length(0)); 20 | 21 | shouldThrow('# ! "" length is 2', () => Assert("").length(2)); 22 | }); 23 | 24 | describe('Assert.lengthIn', () => { 25 | noThrow('# [] lengthIn [0, Infinity)', () => Assert([]).lengthIn(0)); 26 | noThrow('# [] lengthIn [0, Infinity)', () => Assert([]).lengthIn(0, Infinity)); 27 | noThrow('# [] lengthIn [0, 10)', () => Assert([]).lengthIn(0, 10)); 28 | 29 | noThrow('# "Hello" lengthIn [0, 6)', () => Assert([]).lengthIn(0, 6)); 30 | 31 | 32 | shouldThrow('# ! [] lengthIn [0, 0)', () => Assert([]).lengthIn(0, 0)); 33 | shouldThrow('# ! [1] lengthIn [0, 0)', () => Assert([1]).lengthIn(0, 1)); 34 | shouldThrow('# ! [1,2] lengthIn [0, 0)', () => Assert([1, 2]).lengthIn(1, 2)); 35 | }); 36 | 37 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | let assert = require('assert'), 4 | { AssertionError } = assert; 5 | 6 | module.exports = { 7 | Assert, Invoke 8 | }; 9 | 10 | /** @param {any} value */ 11 | function Assert(value) { 12 | let throwAssertionError = (message, expected, actual) => { 13 | throw new AssertionError({ message, expected, actual }) }; 14 | 15 | let chains = { 16 | get and() { return chains }, 17 | 18 | print, 19 | 20 | isTrue, isFalse, isUndefined, 21 | 22 | equals, equalsInJSON, fieldsEqual, 23 | 24 | differentFrom, greaterThan, lessThan, 25 | 26 | isString, isNumber, isObject, isTypeof, 27 | isArray, isEmpty, 28 | 29 | length, lengthIn, 30 | 31 | containsKeys, containsValue, containsSubString, 32 | doesNotContainSubString, 33 | 34 | trim, 35 | 36 | allKeys, allKeyValueTuples, child, sort, parseJSON, each, 37 | convertBy, 38 | 39 | // aliases: 40 | field: child 41 | }; 42 | return chains; 43 | 44 | function print() { 45 | console.log(value); 46 | return chains; 47 | } 48 | 49 | function isTrue() { return equals(true); } 50 | function isFalse() { return equals(false); } 51 | function isUndefined() { return equals(undefined); } 52 | function isString() { return isTypeof('string'); } 53 | function isNumber() { return isTypeof('number'); } 54 | function isObject() { return isTypeof('object'); } 55 | 56 | /** @param {string} type */ 57 | function isTypeof(type) { 58 | assert.deepStrictEqual(typeof value, type); 59 | return chains; 60 | } 61 | 62 | function equals(expected) { 63 | assert.deepStrictEqual(value, expected); 64 | return chains; 65 | } 66 | function differentFrom(expected) { 67 | assert.notDeepStrictEqual(value, expected); 68 | return chains; 69 | } 70 | 71 | /** @type {any} */ 72 | function equalsInJSON(expected) { 73 | assert.deepStrictEqual(JSON.stringify(value), JSON.stringify(expected)); 74 | return chains; 75 | } 76 | 77 | function greaterThan(expected) { 78 | if(value > expected) 79 | return chains; 80 | throwAssertionError(`value is not greater than ${expected}`, `greater than ${expected}`, value); 81 | } 82 | function lessThan(expected) { 83 | if(value < expected) 84 | return chains; 85 | throwAssertionError(`value is not less than ${expected}`, `less than ${expected}`, value); 86 | } 87 | 88 | /** @param {{[fieldName: string]: any}} equalMap */ 89 | function fieldsEqual(equalMap) { 90 | for (let fieldName in equalMap) 91 | assert.deepStrictEqual(value[fieldName], equalMap[fieldName]); 92 | return chains; 93 | } 94 | 95 | function isArray() { 96 | if (!Array.isArray(value)) 97 | throwAssertionError('Value is not an array', 'An Array', value); 98 | return chains; 99 | } 100 | 101 | function isEmpty() { 102 | let type = typeof value; 103 | if (Array.isArray(value) || type == 'string') 104 | return length(0); 105 | if (type == 'number') 106 | return equals(0); 107 | 108 | if (type == 'object' && !value) // null 109 | return chains; 110 | 111 | return isUndefined(); 112 | } 113 | 114 | /** @param {number} len */ 115 | function length(len) { 116 | let actual = value.length; 117 | if (typeof actual != 'number') 118 | throwAssertionError('value.length is not a number', 'value.length is a number', value); 119 | if (actual !== len) 120 | throwAssertionError(`value.length != ${len}`, len, actual); 121 | return chains; 122 | } 123 | 124 | /** 125 | * length of value in range: [min, max) 126 | * @param {number} min 127 | * @param {number} [max] 128 | */ 129 | function lengthIn(min, max = Infinity) { 130 | if (typeof value.length != 'number') 131 | throwAssertionError('value.length is not a number', 'value.length is a number', value); 132 | let range = `[${min}, ${max})`; 133 | if (value.length < min) 134 | throwAssertionError(`value.length < ${min}`, range, value.length); 135 | if (value.length >= max) 136 | throwAssertionError(`value.length < ${min}`, range, value.length); 137 | return chains; 138 | } 139 | 140 | /** @param {string[]} keys */ 141 | function containsKeys(...keys) { 142 | for (let k of keys) 143 | if (!(k in value)) 144 | throwAssertionError(`\`${k}\` is missing in value`, `{ "${k}": any, ... }`, value); 145 | return chains; 146 | } 147 | 148 | /** @param {any} v */ 149 | function containsValue(v) { 150 | for (let key in value) 151 | if (value[key] == v) 152 | return chains; 153 | throwAssertionError(`${JSON.stringify(v)} is missing in value`, `contains ${JSON.stringify(v)}`, value); 154 | } 155 | 156 | /** @param {string} subString */ 157 | function containsSubString(subString) { 158 | isString(); 159 | if (value.indexOf(subString) < 0) { 160 | let name = JSON.stringify(subString); 161 | if (name.length > 100) name = name.slice(0, 95) + " ... \""; 162 | throwAssertionError(`value doesn't contain substring`, `string contains ${name}`, value); 163 | } 164 | return chains; 165 | } 166 | 167 | /** @param {string} subString */ 168 | function doesNotContainSubString(subString) { 169 | isString(); 170 | if (value.indexOf(subString) >= 0) { 171 | let name = JSON.stringify(subString); 172 | if (name.length > 100) name = name.slice(0, 95) + " ... \""; 173 | throwAssertionError(`value contains substring`, `string doesn't contains ${name}`, value); 174 | } 175 | return chains; 176 | } 177 | 178 | function trim() { 179 | isString(); 180 | return Assert(value.trim()); 181 | } 182 | 183 | function allKeys() { 184 | return Assert(Object.keys(value)); 185 | } 186 | 187 | function allKeyValueTuples() { 188 | return Assert(Object.keys(value).map(k => ({ k, v: value[k] }))); 189 | } 190 | 191 | function sort() { 192 | isArray(); 193 | return Assert(Object.assign([], value).sort()); 194 | } 195 | 196 | /** @param {string} fieldName */ 197 | function child(fieldName) { 198 | containsKeys(fieldName); 199 | return Assert(value[fieldName]); 200 | } 201 | 202 | /** @param {(value: any, key: string) => any} handler */ 203 | function each(handler) { 204 | for (let k in value) 205 | handler(value[k], k); 206 | return chains; 207 | } 208 | 209 | function parseJSON() { 210 | let object = void 0; 211 | try { 212 | object = JSON.parse(value); 213 | } catch (ex) { 214 | throwAssertionError('Could not parse JSON', `A valid JSON`, `Invalid JSON: ${ex.message}`); 215 | } 216 | return Assert(object); 217 | } 218 | 219 | /** @param {(any) => any} handler */ 220 | function convertBy(handler) { 221 | return Assert(handler(value)); 222 | } 223 | } 224 | 225 | /** 226 | * @param {Function} func 227 | * @param {any} [context] 228 | * @param {any[]} [parameters] 229 | */ 230 | function Invoke(func, context, ...parameters) { 231 | let invokeExpression = `${func.name}(${parameters.map(p=>JSON.stringify(p)).join(', ')})`; 232 | let value = undefined, 233 | exception = undefined; 234 | 235 | try { 236 | value = func.call(context, ...parameters); 237 | } catch (e) { 238 | exception = e; 239 | } 240 | 241 | let chains = Object.assign({ hasException }, Assert(value)); 242 | 243 | if (typeof exception != 'undefined') { 244 | let throwAgain = (originalCheckerName) => { 245 | throw new AssertionError({ 246 | message: `${invokeExpression} thrown an exception`, 247 | expected: originalCheckerName, 248 | actual: 'message' in exception ? exception.message : exception 249 | }); 250 | }; 251 | for (let funcName in chains) 252 | if (funcName != hasException.name) 253 | chains[funcName] = throwAgain.bind(this, funcName); 254 | } 255 | 256 | return chains; 257 | 258 | function hasException(keyword = '') { 259 | let expected = keyword ? `An exception has keyword "${keyword}"` : `An exception`; 260 | if (typeof exception == 'undefined') { 261 | throw new AssertionError({ 262 | message: `${invokeExpression} didn't thrown an exception`, 263 | expected, actual: 'No exception' 264 | }); 265 | } 266 | if (keyword) { 267 | let message = String('message' in exception ? exception.message : exception); 268 | if (message.toLowerCase().indexOf(keyword.toLowerCase()) < 0) 269 | throw new AssertionError({ 270 | message: `${invokeExpression} thrown an exception without keyword`, 271 | expected, actual: `An exception with message: ${JSON.stringify(message)}` 272 | }) 273 | } 274 | // OK 275 | } 276 | } 277 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/mocha@^9.0.0": 6 | version "9.0.0" 7 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" 8 | integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== 9 | 10 | "@types/node@^9.6.2": 11 | version "9.6.61" 12 | resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.61.tgz#29f124eddd41c4c74281bd0b455d689109fc2a2d" 13 | integrity sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ== 14 | 15 | "@ungap/promise-all-settled@1.1.2": 16 | version "1.1.2" 17 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 18 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 19 | 20 | ansi-colors@4.1.1: 21 | version "4.1.1" 22 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 23 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 24 | 25 | ansi-regex@^5.0.1: 26 | version "5.0.1" 27 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 28 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 29 | 30 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 31 | version "4.3.0" 32 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 33 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 34 | dependencies: 35 | color-convert "^2.0.1" 36 | 37 | anymatch@~3.1.2: 38 | version "3.1.2" 39 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 40 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 41 | dependencies: 42 | normalize-path "^3.0.0" 43 | picomatch "^2.0.4" 44 | 45 | argparse@^2.0.1: 46 | version "2.0.1" 47 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 48 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 49 | 50 | balanced-match@^1.0.0: 51 | version "1.0.2" 52 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 53 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 54 | 55 | binary-extensions@^2.0.0: 56 | version "2.2.0" 57 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 58 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 59 | 60 | brace-expansion@^1.1.7: 61 | version "1.1.11" 62 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 63 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 64 | dependencies: 65 | balanced-match "^1.0.0" 66 | concat-map "0.0.1" 67 | 68 | braces@~3.0.2: 69 | version "3.0.2" 70 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 71 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 72 | dependencies: 73 | fill-range "^7.0.1" 74 | 75 | browser-stdout@1.3.1: 76 | version "1.3.1" 77 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 78 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 79 | 80 | camelcase@^6.0.0: 81 | version "6.2.1" 82 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" 83 | integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== 84 | 85 | chalk@^4.1.0: 86 | version "4.1.2" 87 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 88 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 89 | dependencies: 90 | ansi-styles "^4.1.0" 91 | supports-color "^7.1.0" 92 | 93 | chokidar@3.5.2: 94 | version "3.5.2" 95 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 96 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== 97 | dependencies: 98 | anymatch "~3.1.2" 99 | braces "~3.0.2" 100 | glob-parent "~5.1.2" 101 | is-binary-path "~2.1.0" 102 | is-glob "~4.0.1" 103 | normalize-path "~3.0.0" 104 | readdirp "~3.6.0" 105 | optionalDependencies: 106 | fsevents "~2.3.2" 107 | 108 | cliui@^7.0.2: 109 | version "7.0.4" 110 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 111 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 112 | dependencies: 113 | string-width "^4.2.0" 114 | strip-ansi "^6.0.0" 115 | wrap-ansi "^7.0.0" 116 | 117 | color-convert@^2.0.1: 118 | version "2.0.1" 119 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 120 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 121 | dependencies: 122 | color-name "~1.1.4" 123 | 124 | color-name@~1.1.4: 125 | version "1.1.4" 126 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 127 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 128 | 129 | concat-map@0.0.1: 130 | version "0.0.1" 131 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 132 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 133 | 134 | debug@4.3.2: 135 | version "4.3.2" 136 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 137 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 138 | dependencies: 139 | ms "2.1.2" 140 | 141 | decamelize@^4.0.0: 142 | version "4.0.0" 143 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 144 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 145 | 146 | diff@5.0.0: 147 | version "5.0.0" 148 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 149 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 150 | 151 | emoji-regex@^8.0.0: 152 | version "8.0.0" 153 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 154 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 155 | 156 | escalade@^3.1.1: 157 | version "3.1.1" 158 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 159 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 160 | 161 | escape-string-regexp@4.0.0: 162 | version "4.0.0" 163 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 164 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 165 | 166 | fill-range@^7.0.1: 167 | version "7.0.1" 168 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 169 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 170 | dependencies: 171 | to-regex-range "^5.0.1" 172 | 173 | find-up@5.0.0: 174 | version "5.0.0" 175 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 176 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 177 | dependencies: 178 | locate-path "^6.0.0" 179 | path-exists "^4.0.0" 180 | 181 | flat@^5.0.2: 182 | version "5.0.2" 183 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 184 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 185 | 186 | fs.realpath@^1.0.0: 187 | version "1.0.0" 188 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 189 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 190 | 191 | fsevents@~2.3.2: 192 | version "2.3.2" 193 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 194 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 195 | 196 | get-caller-file@^2.0.5: 197 | version "2.0.5" 198 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 199 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 200 | 201 | glob-parent@~5.1.2: 202 | version "5.1.2" 203 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 204 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 205 | dependencies: 206 | is-glob "^4.0.1" 207 | 208 | glob@7.1.7: 209 | version "7.1.7" 210 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 211 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 212 | dependencies: 213 | fs.realpath "^1.0.0" 214 | inflight "^1.0.4" 215 | inherits "2" 216 | minimatch "^3.0.4" 217 | once "^1.3.0" 218 | path-is-absolute "^1.0.0" 219 | 220 | growl@1.10.5: 221 | version "1.10.5" 222 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 223 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 224 | 225 | has-flag@^4.0.0: 226 | version "4.0.0" 227 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 228 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 229 | 230 | he@1.2.0: 231 | version "1.2.0" 232 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 233 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 234 | 235 | inflight@^1.0.4: 236 | version "1.0.6" 237 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 238 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 239 | dependencies: 240 | once "^1.3.0" 241 | wrappy "1" 242 | 243 | inherits@2: 244 | version "2.0.4" 245 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 246 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 247 | 248 | is-binary-path@~2.1.0: 249 | version "2.1.0" 250 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 251 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 252 | dependencies: 253 | binary-extensions "^2.0.0" 254 | 255 | is-extglob@^2.1.1: 256 | version "2.1.1" 257 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 258 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 259 | 260 | is-fullwidth-code-point@^3.0.0: 261 | version "3.0.0" 262 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 263 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 264 | 265 | is-glob@^4.0.1, is-glob@~4.0.1: 266 | version "4.0.3" 267 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 268 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 269 | dependencies: 270 | is-extglob "^2.1.1" 271 | 272 | is-number@^7.0.0: 273 | version "7.0.0" 274 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 275 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 276 | 277 | is-plain-obj@^2.1.0: 278 | version "2.1.0" 279 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 280 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 281 | 282 | is-unicode-supported@^0.1.0: 283 | version "0.1.0" 284 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 285 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 286 | 287 | isexe@^2.0.0: 288 | version "2.0.0" 289 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 290 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 291 | 292 | js-yaml@4.1.0: 293 | version "4.1.0" 294 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 295 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 296 | dependencies: 297 | argparse "^2.0.1" 298 | 299 | locate-path@^6.0.0: 300 | version "6.0.0" 301 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 302 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 303 | dependencies: 304 | p-locate "^5.0.0" 305 | 306 | log-symbols@4.1.0: 307 | version "4.1.0" 308 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 309 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 310 | dependencies: 311 | chalk "^4.1.0" 312 | is-unicode-supported "^0.1.0" 313 | 314 | minimatch@3.0.4, minimatch@^3.0.4: 315 | version "3.0.4" 316 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 317 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 318 | dependencies: 319 | brace-expansion "^1.1.7" 320 | 321 | mocha@^9.1.3: 322 | version "9.1.3" 323 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" 324 | integrity sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw== 325 | dependencies: 326 | "@ungap/promise-all-settled" "1.1.2" 327 | ansi-colors "4.1.1" 328 | browser-stdout "1.3.1" 329 | chokidar "3.5.2" 330 | debug "4.3.2" 331 | diff "5.0.0" 332 | escape-string-regexp "4.0.0" 333 | find-up "5.0.0" 334 | glob "7.1.7" 335 | growl "1.10.5" 336 | he "1.2.0" 337 | js-yaml "4.1.0" 338 | log-symbols "4.1.0" 339 | minimatch "3.0.4" 340 | ms "2.1.3" 341 | nanoid "3.1.25" 342 | serialize-javascript "6.0.0" 343 | strip-json-comments "3.1.1" 344 | supports-color "8.1.1" 345 | which "2.0.2" 346 | workerpool "6.1.5" 347 | yargs "16.2.0" 348 | yargs-parser "20.2.4" 349 | yargs-unparser "2.0.0" 350 | 351 | ms@2.1.2: 352 | version "2.1.2" 353 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 354 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 355 | 356 | ms@2.1.3: 357 | version "2.1.3" 358 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 359 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 360 | 361 | nanoid@3.1.25: 362 | version "3.1.25" 363 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" 364 | integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== 365 | 366 | normalize-path@^3.0.0, normalize-path@~3.0.0: 367 | version "3.0.0" 368 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 369 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 370 | 371 | once@^1.3.0: 372 | version "1.4.0" 373 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 374 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 375 | dependencies: 376 | wrappy "1" 377 | 378 | p-limit@^3.0.2: 379 | version "3.1.0" 380 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 381 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 382 | dependencies: 383 | yocto-queue "^0.1.0" 384 | 385 | p-locate@^5.0.0: 386 | version "5.0.0" 387 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 388 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 389 | dependencies: 390 | p-limit "^3.0.2" 391 | 392 | path-exists@^4.0.0: 393 | version "4.0.0" 394 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 395 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 396 | 397 | path-is-absolute@^1.0.0: 398 | version "1.0.1" 399 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 400 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 401 | 402 | picomatch@^2.0.4, picomatch@^2.2.1: 403 | version "2.3.0" 404 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 405 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 406 | 407 | randombytes@^2.1.0: 408 | version "2.1.0" 409 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 410 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 411 | dependencies: 412 | safe-buffer "^5.1.0" 413 | 414 | readdirp@~3.6.0: 415 | version "3.6.0" 416 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 417 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 418 | dependencies: 419 | picomatch "^2.2.1" 420 | 421 | require-directory@^2.1.1: 422 | version "2.1.1" 423 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 424 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 425 | 426 | safe-buffer@^5.1.0: 427 | version "5.2.1" 428 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 429 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 430 | 431 | serialize-javascript@6.0.0: 432 | version "6.0.0" 433 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 434 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 435 | dependencies: 436 | randombytes "^2.1.0" 437 | 438 | string-width@^4.1.0, string-width@^4.2.0: 439 | version "4.2.3" 440 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 441 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 442 | dependencies: 443 | emoji-regex "^8.0.0" 444 | is-fullwidth-code-point "^3.0.0" 445 | strip-ansi "^6.0.1" 446 | 447 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 448 | version "6.0.1" 449 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 450 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 451 | dependencies: 452 | ansi-regex "^5.0.1" 453 | 454 | strip-json-comments@3.1.1: 455 | version "3.1.1" 456 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 457 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 458 | 459 | supports-color@8.1.1: 460 | version "8.1.1" 461 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 462 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 463 | dependencies: 464 | has-flag "^4.0.0" 465 | 466 | supports-color@^7.1.0: 467 | version "7.2.0" 468 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 469 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 470 | dependencies: 471 | has-flag "^4.0.0" 472 | 473 | to-regex-range@^5.0.1: 474 | version "5.0.1" 475 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 476 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 477 | dependencies: 478 | is-number "^7.0.0" 479 | 480 | which@2.0.2: 481 | version "2.0.2" 482 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 483 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 484 | dependencies: 485 | isexe "^2.0.0" 486 | 487 | workerpool@6.1.5: 488 | version "6.1.5" 489 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" 490 | integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== 491 | 492 | wrap-ansi@^7.0.0: 493 | version "7.0.0" 494 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 495 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 496 | dependencies: 497 | ansi-styles "^4.0.0" 498 | string-width "^4.1.0" 499 | strip-ansi "^6.0.0" 500 | 501 | wrappy@1: 502 | version "1.0.2" 503 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 504 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 505 | 506 | y18n@^5.0.5: 507 | version "5.0.8" 508 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 509 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 510 | 511 | yargs-parser@20.2.4: 512 | version "20.2.4" 513 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 514 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 515 | 516 | yargs-parser@^20.2.2: 517 | version "20.2.9" 518 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 519 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 520 | 521 | yargs-unparser@2.0.0: 522 | version "2.0.0" 523 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 524 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 525 | dependencies: 526 | camelcase "^6.0.0" 527 | decamelize "^4.0.0" 528 | flat "^5.0.2" 529 | is-plain-obj "^2.1.0" 530 | 531 | yargs@16.2.0: 532 | version "16.2.0" 533 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 534 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 535 | dependencies: 536 | cliui "^7.0.2" 537 | escalade "^3.1.1" 538 | get-caller-file "^2.0.5" 539 | require-directory "^2.1.1" 540 | string-width "^4.2.0" 541 | y18n "^5.0.5" 542 | yargs-parser "^20.2.2" 543 | 544 | yocto-queue@^0.1.0: 545 | version "0.1.0" 546 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 547 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 548 | --------------------------------------------------------------------------------