From 08620aa330e432d2a18fdf7aea7063a7e992abd1 Mon Sep 17 00:00:00 2001 From: zhhsh Date: Sat, 27 Aug 2022 23:51:48 +0800 Subject: [PATCH 1/5] Update rename.js finish homework1 --- homework/1/rename.js | 52 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/homework/1/rename.js b/homework/1/rename.js index 0bbd947..d9cdc40 100644 --- a/homework/1/rename.js +++ b/homework/1/rename.js @@ -4,11 +4,59 @@ const traverse = require('../../common/traverse'); function transform(root, originName, targetName) { // 遍历所有节点 + const parentNodeStack = []; // stores ancestors + const isNode = target => + target && typeof target.type === 'string'; + const isNodeArray = target => + Array.isArray(target) && target[0] && isNode(target[0]); + const isChildNode = target => + isNodeArray(target) || isNode(target); + const getChildrenKeys = node => + Object.keys(node).filter(key => isChildNode(node[key])); + const isParent = (parent, child) => { + for (const key of getChildrenKeys(parent)) { + if (Array.isArray(parent[key])) { + for (let i = 0; i < parent[key].length; i++) { + if (parent[key][i] === child) { return [true, key] } + } + } else { + if (parent[key] === child) { return [true, key] } + } + } + return [false, '']; + } + return traverse((node, ctx, next) => { // TODO: 作业代码写在这里 - if (node.type === 'xxx') { + // find parent and propertyName + let parent = null, propertyName = '' + while (parentNodeStack.length > 0) { + parent = parentNodeStack[parentNodeStack.length - 1] + let res = isParent(parent, node) + propertyName = res[1] + if (res[0]) { + break + } else { + parent = null + propertyName = '' + parentNodeStack.pop(); + } } + // console.log(node.type); + // 模式:type === 'Identifier' 可能是变量名(包括函数名)、属性名、标签。 + // 标签的话会是'label'作为propertyName + // 属性名在对象声明时,会是'key'作为propertyName + // 属性名在对象的属性表达式时,会是'property'作为propertyName + if (node.type === 'Identifier' && node.name === originName && parent !== null && propertyName !== 'property' && propertyName !== 'label' && propertyName !== 'key') { + // console.log('node:' + node.type); + // console.log(parent === null ? 'null' : 'parent:' + parent.type); + // console.log(propertyName); + node.name = targetName; + } + + // update parentNodeStack + parentNodeStack.push(node); // 继续往下遍历 return next(node, ctx) @@ -19,7 +67,7 @@ function rename(code, originName, targetName) { const ast = acorn.parse(code, { ecmaVersion: 5, }) - return astring.generate(transform(ast, originName, targetName)) + return astring.generate(transform(ast, originName, targetName)); } module.exports = rename \ No newline at end of file From 27ac0342c61d712a6b05992eef2180ecb109d604 Mon Sep 17 00:00:00 2001 From: zhhsh Date: Fri, 2 Sep 2022 02:13:31 +0800 Subject: [PATCH 2/5] Update eval.js finish homework 2 --- homework/2/eval.js | 136 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/homework/2/eval.js b/homework/2/eval.js index be527f5..d5bbe1f 100644 --- a/homework/2/eval.js +++ b/homework/2/eval.js @@ -2,8 +2,142 @@ const acorn = require('acorn'); function evaluate(node, env) { switch (node.type) { + // 字面量 case 'Literal': - // TODO: 补全作业代码 + // TODO: 补全作业代码 + return node.value; + // 数组字面量 + case 'ArrayExpression': + return node.elements.map(element => evaluate(element, env)); + // 对象字面量 + case 'ObjectExpression': + const obj = {}; + // property.kind must be 'init' (not 'get' or 'set') + for (const property of node.properties) { + obj[property.key.name] = evaluate(property.value, env); + } + return obj; + // 变量 + case 'Identifier': + return env[node.name]; + // this, @todo + case 'ThisExpression': + return undefined; + // 一元运算表达式 + case 'UnaryExpression': + switch (node.operator) { + case '+': return +evaluate(node.argument, env); // 取正 + case '-': return -evaluate(node.argument, env); // 取负 + case '!': return !evaluate(node.argument, env); // 逻辑取反 + case '~': return ~evaluate(node.argument, env); // 位反 + case 'typeof': return typeof (evaluate(node.argument, env)); // typeof + case 'void': return void (evaluate(node.argument, env)); // @todo(not sure) + // delete, delete.argumnet must be a MemberExpression node + case 'delete': // @todo(not sure) + return delete evaluate(node.argument.object, env)[node.argument.property.name]; + } + // ++、--, argument must be an 'Identifier' node + case 'UpdateExpression': + if (node.prefix && node.operator === '++') { // 前缀++ + return ++env[node.argument.name]; + } else if (node.prefix && node.operator === '--') { // 前缀-- + return --env[node.argument.name]; + } else if (!node.prefix && node.operator === '++') { // 后缀++ + return env[node.argument.name]++; + } else if (!node.prefix && node.operator === '--') { // 后缀-- + return env[node.argument.name]--; + } + // 二元运算表达式 + case 'BinaryExpression': + switch (node.operator) { + // 数值运算 + case '+': return evaluate(node.left, env) + evaluate(node.right, env); + case '-': return evaluate(node.left, env) - evaluate(node.right, env); + case '*': return evaluate(node.left, env) * evaluate(node.right, env); + case '/': return evaluate(node.left, env) / evaluate(node.right, env); + case '%': return evaluate(node.left, env) % evaluate(node.right, env); + // 位运算 + case '|': return evaluate(node.left, env) | evaluate(node.right, env); + case '&': return evaluate(node.left, env) & evaluate(node.right, env); + case '^': return evaluate(node.left, env) ^ evaluate(node.right, env); + // 移位运算 + case '>>': return evaluate(node.left, env) >> evaluate(node.right, env); + case '<<': return evaluate(node.left, env) << evaluate(node.right, env); + case '>>>': return evaluate(node.left, env) >>> evaluate(node.right, env); + // 关系运算 + case '==': return evaluate(node.left, env) == evaluate(node.right, env); + case '!=': return evaluate(node.left, env) != evaluate(node.right, env); + case '===': return evaluate(node.left, env) === evaluate(node.right, env); + case '!==': return evaluate(node.left, env) !== evaluate(node.right, env); + case '>': return evaluate(node.left, env) > evaluate(node.right, env); + case '<': return evaluate(node.left, env) < evaluate(node.right, env); + case '>=': return evaluate(node.left, env) >= evaluate(node.right, env); + case '<=': return evaluate(node.left, env) <= evaluate(node.right, env); + case 'in': return evaluate(node.left, env) in evaluate(node.right, env); // in + case 'instanceof': return evaluate(node.left, env) instanceof evaluate(node.right, env); // instanceof + } + // 赋值运算, lvalue must be an 'Identifier' node + case 'AssignmentExpression': + switch (node.operator) { + case '=': return env[node.left.name] = evaluate(node.right, env); + case '+=': return env[node.left.name] += evaluate(node.right, env); + case '-=': return env[node.left.name] -= evaluate(node.right, env); + case '*=': return env[node.left.name] *= evaluate(node.right, env); + case '/=': return env[node.left.name] /= evaluate(node.right, env); + case '%=': return env[node.left.name] %= evaluate(node.right, env); + case '|=': return env[node.left.name] |= evaluate(node.right, env); + case '&=': return env[node.left.name] &= evaluate(node.right, env); + case '^=': return env[node.left.name] ^= evaluate(node.right, env); + case '<<=': return env[node.left.name] <<= evaluate(node.right, env); + case '>>=': return env[node.left.name] >>= evaluate(node.right, env); + case '>>>=': return env[node.left.name] >>>= evaluate(node.right, env); + } + // 逻辑运算 + case 'LogicalExpression': + switch (node.operator) { + case '&&': return evaluate(node.left, env) && evaluate(node.right, env); + case '||': return evaluate(node.left, env) || evaluate(node.right, env); + } + // 取成员值 + case 'MemberExpression': return evaluate(node.object)[evaluate(node.property, env)]; + // 三元运算符 + case 'ConditionalExpression': + return evaluate(node.test, env) ? evaluate(node.consequent, env) : evaluate(node.alternate, env); + case 'CallExpression': + return evaluate(node.callee, env)(...node.arguments.map(arg => evaluate(arg, env))); + // 逗号表达式 + case 'SequenceExpression': + let last; + for (const expression of node.expressions) { + last = evaluate(expression, env); + } + return last; + // 函数表达式 @todo + case 'FunctionExpression': return undefined; + // 箭头函数 + case 'ArrowFunctionExpression': + if (node.body.type === 'BlockStatement') { // 函数体为代码块 @todo + return undefined; + } else { // 函数体为返回值 + return function (...args) { + // 函数的局部变量 + const funcEnv = {}; + for (let i = 0; i < node.params.length; i++) { + funcEnv[node.params[i].name] = args[i]; + } + // 记录没有同名内部变量的外部变量名 + const envMinusFuncEnv = Object.keys(env).filter(varname => funcEnv[varname] === undefined); + // 新建的函数内的执行环境 + let newEnv = { ...env, ...funcEnv }; + let retVal = evaluate(node.body, newEnv); + // 函数内对外部变量的修改反映到原环境中 + envMinusFuncEnv.forEach(varname => { env[varname] = newEnv[varname] }) + return retVal; + } + } + // 表达式语句` + case 'ExpressionStatement': + return evaluate(node.expression, env); } throw new Error(`Unsupported Syntax ${node.type} at Location ${node.start}:${node.end}`); From 64b4986bf0ac7878624e408b6abaec32c09844bc Mon Sep 17 00:00:00 2001 From: zhhsh Date: Mon, 19 Sep 2022 22:34:07 +0800 Subject: [PATCH 3/5] homework3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit homework3基本完成,TOFIX(测试声明与控制流 - 超纲挑战) --- homework/3/eval.js | 489 +++++++++++++++++++++++++++++++++++++++- homework/3/eval.test.js | 3 +- 2 files changed, 488 insertions(+), 4 deletions(-) diff --git a/homework/3/eval.js b/homework/3/eval.js index 4ff65d2..2c7dc1c 100644 --- a/homework/3/eval.js +++ b/homework/3/eval.js @@ -1,9 +1,492 @@ const acorn = require('acorn'); -function evaluate(node, env) { +class Scope { + constructor(type, parent = null) { + this.variables = {}; + this.type = type; + this.parent = parent; + } + + declare(kind, name) { + let scope = this; + while (kind === 'var' && scope.type === 'block') { + if (Object.hasOwn(scope.variables, name)) { throw new SyntaxError(`Cannot declare a variable twice`); } + scope = scope.parent; + } + if (Object.hasOwn(scope.variables, name)) { + if (scope.variables[name].kind !== 'var' || kind !== 'var') { throw new SyntaxError(`Cannot declare a variable twice`); } + // else do nothing + } else { + scope.variables[name] = { value: undefined, kind }; + } + } + + get(name) { + let scope = this; + while (scope && !Object.hasOwn(scope.variables, name)) { scope = scope.parent; } + if (!scope) { throw new ReferenceError(`Can't find variable`); } + return scope.variables[name].value; + } + + set(name, value, init = false) { + let scope = this; + while (scope && !Object.hasOwn(scope.variables, name)) { scope = scope.parent; } + if (!scope) { throw new ReferenceError(`Can't find variable`); } + if (scope.variables[name].kind === 'const' && !init) { throw new TypeError('Assignment to constant variable'); } + return scope.variables[name].value = value; + } + + display() { + const vars_arr = []; + let scope = this; + while (scope) { + vars_arr.unshift('{' + Object.entries(scope.variables).filter(e => e[0] != 'thisArg').map((e) => e[0] + ':' + e[1].value).join(', ') + '}'); + scope = scope.parent; + } + console.log(vars_arr.join(' -> ')); + } +} + +class ReturnObject { + constructor(value = undefined) { + this.value = value; + } + toString() { + return 'ReturnObject{' + Object.keys(this).map(attr => `${attr}: ${this[attr]}`).join(', ') + '}' + } +} +class BreakObject { + constructor(label = undefined) { + this.label = label; + } + toString() { + return 'BreakObject{' + Object.keys(this).map(attr => `${attr}: ${this[attr]}`).join(', ') + '}' + } +} +class ContinueObject { + constructor(label = undefined) { + this.label = label; + } + toString() { + return 'ContinueObject{' + Object.keys(this).map(attr => `${attr}: ${this[attr]}`).join(', ') + '}' + } +} + +function evaluate(node, scope) { + // debugger; switch (node.type) { - case 'Literal': - // TODO: 补全作业代码 + // the Program + case 'Program': { + // TOFIX: init global scope + const globalScope = new Scope('global', null); + globalScope.declare('var', 'thisArg'); + globalScope.set('thisArg', globalScope); + + let result; + for (const stat of node.body) { + result = evaluate(stat, globalScope); + } + return result; + } + + // Expressions + case 'Identifier': return scope.get(node.name); + case 'Literal': return node.value; + case 'ArrayExpression': return node.elements.map(e => evaluate(e, scope)); + case 'ObjectExpression': { + const obj = {}; + for (const property of node.properties) { + if (property.computed) { // {[propExp]:value} + obj[evaluate(property.key, scope)] = evaluate(property.value, scope); + } else { // {propName:value} + obj[property.key.name] = evaluate(property.value, scope); + } + } + return obj; + } + case 'MemberExpression': { + if (node.computed) { // obj[propExp] + return evaluate(node.object, scope)[evaluate(node.property, scope)]; + } else { // obj.propName + return evaluate(node.object, scope)[node.property.name]; + } + } + case 'UnaryExpression': + if (node.operator === '-') { + return -evaluate(node.argument, scope); + } else if (node.operator === '+') { + return +evaluate(node.argument, scope); + } else if (node.operator === '!') { + return !evaluate(node.argument, scope); + } else if (node.operator === '~') { + return ~evaluate(node.argument, scope); + } else if (node.operator === 'typeof') { + return typeof evaluate(node.argument, scope); + } else if (node.operator === 'void') { + return void evaluate(node.argument, scope); + } else if (node.operator === 'delete') { + throw new SyntaxError('Unsupported Operation'); // TOFIX + } + case 'UpdateExpression': { + let returnValue, assignValue; + if (node.prefix && node.operator === '++') { + returnValue = scope.get(node.argument.name) + 1; + assignValue = returnValue; + } else if (node.prefix && node.operator === '--') { + returnValue = scope.get(node.argument.name) - 1; + assignValue = returnValue; + } else if (!node.prefix && node.operator === '++') { + returnValue = scope.get(node.argument.name); + assignValue = returnValue + 1; + } else if (!node.prefix && node.operator === '--') { + returnValue = scope.get(node.argument.name); + assignValue = returnValue - 1; + } + // 因为对象属性保存在JS对象中,而变量保存在Scope中,所以注意区别处理 + if (node.argument.type === 'MemberExpression') { // 对象属性赋值 + if (node.argument.computed) { // obj[propExp] + evaluate(node.argument.object, scope)[evaluate(node.argument.property, scope)] = assignValue; + } else { // obj.propName + evaluate(node.argument.object, scope)[node.argument.property.name] = assignValue; + } + } else { + scope.set(node.argument.name, assignValue); // 变量赋值 + } + return returnValue; + } + case 'BinaryExpression': + if (node.operator === '+') { + return evaluate(node.left, scope) + evaluate(node.right, scope); + } else if (node.operator === '-') { + return evaluate(node.left, scope) - evaluate(node.right, scope); + } else if (node.operator === '*') { + return evaluate(node.left, scope) * evaluate(node.right, scope); + } else if (node.operator === '/') { + return evaluate(node.left, scope) / evaluate(node.right, scope); + } else if (node.operator === '%') { + return evaluate(node.left, scope) % evaluate(node.right, scope); + } else if (node.operator === '<') { + return evaluate(node.left, scope) < evaluate(node.right, scope); + } else if (node.operator === '<=') { + return evaluate(node.left, scope) <= evaluate(node.right, scope); + } else if (node.operator === '>') { + return evaluate(node.left, scope) > evaluate(node.right, scope); + } else if (node.operator === '>=') { + return evaluate(node.left, scope) >= evaluate(node.right, scope); + } else if (node.operator === '==') { + return evaluate(node.left, scope) == evaluate(node.right, scope); + } else if (node.operator === '!=') { + return evaluate(node.left, scope) != evaluate(node.right, scope); + } else if (node.operator === '===') { + return evaluate(node.left, scope) === evaluate(node.right, scope); + } else if (node.operator === '!==') { + return evaluate(node.left, scope) !== evaluate(node.right, scope); + } else if (node.operator === '^') { + return evaluate(node.left, scope) ^ evaluate(node.right, scope); + } else if (node.operator === '&') { + return evaluate(node.left, scope) & evaluate(node.right, scope); + } else if (node.operator === '|') { + return evaluate(node.left, scope) | evaluate(node.right, scope); + } else if (node.operator === '<<') { + return evaluate(node.left, scope) << evaluate(node.right, scope); + } else if (node.operator === '>>') { + return evaluate(node.left, scope) >> evaluate(node.right, scope); + } else if (node.operator === '>>>') { + return evaluate(node.left, scope) >>> evaluate(node.right, scope); + } else if (node.operator === 'in') { + return evaluate(node.left, scope) in evaluate(node.right, scope); + } else if (node.operator === 'instanceof') { + return evaluate(node.left, scope) instanceof evaluate(node.right, scope); + } + case 'LogicalExpression': + if (node.operator === '||') { + return evaluate(node.left, scope) || evaluate(node.right, scope); + } else if (node.operator === '&&') { + return evaluate(node.left, scope) && evaluate(node.right, scope); + } + case 'AssignmentExpression': { + let result; + if (node.operator === '=') { + result = evaluate(node.right, scope); + } else if (node.operator === '+=') { + result = scope.get(node.left.name) + evaluate(node.right, scope); + } else if (node.operator === '-=') { + result = scope.get(node.left.name) - evaluate(node.right, scope); + } else if (node.operator === '*=') { + result = scope.get(node.left.name) * evaluate(node.right, scope); + } else if (node.operator === '/=') { + result = scope.get(node.left.name) / evaluate(node.right, scope); + } else if (node.operator === '%=') { + result = scope.get(node.left.name) % evaluate(node.right, scope); + } else if (node.operator === '|=') { + result = scope.get(node.left.name) | evaluate(node.right, scope); + } else if (node.operator === '&=') { + result = scope.get(node.left.name) & evaluate(node.right, scope); + } else if (node.operator === '^=') { + result = scope.get(node.left.name) ^ evaluate(node.right, scope); + } else if (node.operator === '<<=') { + result = scope.get(node.left.name) << evaluate(node.right, scope); + } else if (node.operator === '>>=') { + result = scope.get(node.left.name) >> evaluate(node.right, scope); + } else if (node.operator === '>>>=') { + result = scope.get(node.left.name) >>> evaluate(node.right, scope); + } + // 因为对象属性保存在JS对象中,而变量保存在Scope中,所以注意区别处理 + if (node.left.type === 'MemberExpression') { // 对象属性赋值 + if (node.left.computed) { // obj[propExp] + evaluate(node.left.object, scope)[evaluate(node.left.property, scope)] = result; + } else { // obj.propName + evaluate(node.left.object, scope)[node.left.property.name] = result; + } + } else { + scope.set(node.left.name, result); // 变量赋值 + } + return result; + } + case 'ConditionalExpression': return evaluate(node.test, scope) ? evaluate(node.consequent, scope) : evaluate(node.alternate, scope); + case 'SequenceExpression': { + let result; + for (const expr of node.expressions) { + result = evaluate(expr, scope); + } + return result; + } + case 'NewExpression': return Reflect.construct(evaluate(node.callee.name, scope), node.arguments.map(argument => evaluate(argument, scope))); + case 'ThisExpression': return scope.get('thisArg'); + + case 'CallExpression': { + let thisArg; + if (node.callee.type === 'MemberExpression') { // method call + thisArg = evaluate(node.callee.object, scope); + } else { // function call + thisArg = scope.get('thisArg'); + } + return evaluate(node.callee, scope)(thisArg, ...node.arguments.map(argument => evaluate(argument, scope))); + } + case 'FunctionExpression': + return function (thisArg, ...args) { + const functionScope = new Scope('function', scope); + functionScope.declare('var', 'thisArg'); + for (const { name } of node.params) { + functionScope.declare('var', name); + } + functionScope.set('thisArg', thisArg); + for (let i = 0; i < Math.min(node.params.length, args.length); i++) { + functionScope.set(node.params[i].name, args[i]); + } + + const result = evaluate(node.body, functionScope); + if (result instanceof ReturnObject) { + return result.value; + } + return; + } + // IMPORTANT: 函数执行时的functionScope的parent应是函数定义时所处的scope,而不是函数调用时所处的scope + case 'ArrowFunctionExpression': + if (node.body.type === 'BlockStatement') { + return (thisArg, ...args) => { + const functionScope = new Scope('function', scope); + functionScope.declare('var', 'thisArg'); + for (const { name } of node.params) { + functionScope.declare('var', name); + } + functionScope.set('thisArg', thisArg); + for (let i = 0; i < Math.min(node.params.length, args.length); i++) { + functionScope.set(node.params[i].name, args[i]); + } + + const result = evaluate(node.body, functionScope); + if (result instanceof ReturnObject) { + return result.value; + } + return; + } + } else { + return (thisArg, ...args) => { + const functionScope = new Scope('function', scope); + functionScope.declare('var', 'thisArg'); + for (const { name } of node.params) { + functionScope.declare('var', name); + } + functionScope.set('thisArg', scope.get('thisArg')); + for (let i = 0; i < Math.min(node.params.length, args.length); i++) { + functionScope.set(node.params[i].name, args[i]); + } + + return evaluate(node.body, functionScope); + }; + } + + // Statements + case 'ExpressionStatement': { + return evaluate(node.expression, scope); + } + + case 'BlockStatement': { + const blockScope = new Scope('block', scope); + let result; + for (const stat of node.body) { + result = evaluate(stat, blockScope); + if (result instanceof ReturnObject || result instanceof BreakObject || result instanceof ContinueObject) { + return result; + } + } + return; + } + + case 'IfStatement': { + const result = evaluate(node.test, scope) ? evaluate(node.consequent, scope) : (node.alternate ? evaluate(node.alternate, scope) : undefined); + return (result instanceof ReturnObject || result instanceof BreakObject || result instanceof ContinueObject) ? result : undefined; + } + case 'SwitchStatement': { + const switchScope = new Scope('block', scope); + // collect statements in matched cases + const target = evaluate(node.discriminant, switchScope); + const stats = []; let accept = false; + for (const switchCase of node.cases) { + if (switchCase.test === null || evaluate(switchCase.test, switchScope) === target) { + accept = true; + } + if (accept) { + stats.push(...switchCase.consequent); + } + } + // execute statements + let result; + for (const stat of stats) { + result = evaluate(stat, switchScope); + if (result instanceof ReturnObject || result instanceof ContinueObject || (result instanceof BreakObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + return; + } + } + return; + } + + case 'WhileStatement': { + let result; + while (evaluate(node.test, scope)) { + result = evaluate(node.body, scope); + if (result instanceof ReturnObject || (result instanceof BreakObject && result.label !== undefined) || (result instanceof ContinueObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + break; + } else if (result instanceof ContinueObject && result.label === undefined) { + continue; + } + } + return; + } + case 'DoWhileStatement': { + let result; + do { + result = evaluate(node.body, scope); + if (result instanceof ReturnObject || (result instanceof BreakObject && result.label !== undefined) || (result instanceof ContinueObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + break; + } else if (result instanceof ContinueObject && result.label === undefined) { + continue; + } + } while (evaluate(node.test, scope)); + return; + } + case 'ForStatement': { + let tmp, result; + for ( + let blockScope = (tmp = new Scope('block', scope), node.init !== null ? evaluate(node.init, tmp) : 0, tmp); + node.test === null || evaluate(node.test, blockScope); + node.update !== null ? evaluate(node.update, blockScope) : 0 + ) { + result = evaluate(node.body, blockScope); + if (result instanceof ReturnObject || (result instanceof BreakObject && result.label !== undefined) || (result instanceof ContinueObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + break; + } else if (result instanceof ContinueObject && result.label === undefined) { + continue; + } + } + return; + } + case 'ForInStatement': throw new SyntaxError('Unsupported Operation'); // TOFIX + + case 'ReturnStatement': return new ReturnObject(evaluate(node.argument, scope)); + case 'BreakStatement': return new BreakObject(node.label ? node.label.name : undefined); + case 'ContinueStatement': return new ContinueObject(node.label ? node.label.name : undefined); + case 'LabeledStatement': { + // 注:label常用于循环语句,也可用于其他语句(语句块),不可用于声明。break label可以跳出非循环语句(语句块等),continue label必须是循环语句的label + let result = evaluate(node.body, scope); + while (result instanceof ContinueObject && result.label === node.label.name) { + result = evaluate(node.body, scope); + } + + if (result instanceof ReturnObject || (result instanceof ContinueObject && result.label !== node.label.name) || (result instanceof BreakObject && result.label !== node.label.name)) { + return result; + } else if (result instanceof BreakObject && result.label === node.label.name) { + return; + } + return; + } + + case 'TryStatement': { + let result; + try { + result = evaluate(node.block, scope); + } catch (err) { + if (node.handler !== null) { + const catchScope = new Scope('block', scope); + catchScope.declare('block', node.handler.param.name); + catchScope.set(node.handler.param.name, err); + result = evaluate(node.handler.body, catchScope); + } + } finally { + if (node.finalizer !== null) { + const finalizerResult = evaluate(node.finalizer, scope); + if (finalizerResult !== undefined) { + result = finalizerResult; + } + } + return result; + } + } + case 'ThrowStatement': throw evaluate(node.argument, scope); + + case 'EmptyStatement': return undefined; + case 'DebuggerStatement': throw new SyntaxError('Unsupported Operation'); // TOFIX + case 'WithStatement': throw new SyntaxError('Unsupported Operation'); // TOFIX + + // Declaration Statements + case 'FunctionDeclaration': { + scope.declare('var', node.id.name); // TOFIX: 函数名能归于var吗,还是创建'function'类型? + scope.set(node.id.name, function (thisArg, ...args) { + const functionScope = new Scope('function', scope); + functionScope.declare('var', 'thisArg'); + for (const { name } of node.params) { + functionScope.declare('var', name); + } + functionScope.set('thisArg', thisArg); + for (let i = 0; i < Math.min(node.params.length, args.length); i++) { + functionScope.set(node.params[i].name, args[i]); + } + + const result = evaluate(node.body, functionScope); + if (result instanceof ReturnObject) { + return result.value; + } + return; + }); + return; + } + case 'VariableDeclaration': + for (const declaration of node.declarations) { + scope.declare(node.kind, declaration.id.name); + if (declaration.init) { + scope.set(declaration.id.name, evaluate(declaration.init, scope), true); + } + } + return; } throw new Error(`Unsupported Syntax ${node.type} at Location ${node.start}:${node.end}`); diff --git a/homework/3/eval.test.js b/homework/3/eval.test.js index 2e7def4..f3bfaf4 100644 --- a/homework/3/eval.test.js +++ b/homework/3/eval.test.js @@ -27,7 +27,8 @@ test('声明 - 初级挑战', t => { if (err === undefined) { t.deepEqual(customerEval(sourceCode), undefined) } else { - t.throws(() => customerEval(sourceCode), err) + // t.throws(() => customerEval(sourceCode), err) + t.deepEqual(t.throws(() => customerEval(sourceCode)), err); } } }) From 41952b52bffcd4f136f90075a007a1f6d194c034 Mon Sep 17 00:00:00 2001 From: zhhsh Date: Wed, 28 Sep 2022 21:36:53 +0800 Subject: [PATCH 4/5] final - commit 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 已实现final的大部分内容 剩余generator和async function --- .gitignore | 1 + final/eval.js | 871 ++++- .../test/sequence/SequenceExpression.test.js | 3 +- final/test/stack-track.test.js | 1 + package-lock.json | 3014 +++++++++++++++++ 5 files changed, 3887 insertions(+), 3 deletions(-) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 239ecff..6b55e2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules yarn.lock +.DS_Store diff --git a/final/eval.js b/final/eval.js index f48b0f1..4f154ce 100644 --- a/final/eval.js +++ b/final/eval.js @@ -2,18 +2,885 @@ const acorn = require('acorn'); class Scope { constructor(initial /* 初始化变量 */, parent) { + if (initial !== undefined) { + this.variables = {}; + this.parent = parent; + // this.globalThis = parent !== undefined ? parent.globalThis : this; + for (const [name, value] of Object.entries(initial)) { + switch (name) { + case 'global': + this.variables.global = { value: value, kind: 'var', tdz: false, writable: false }; + break; + case 'module': + this.variables.module = { value: value, kind: 'let', tdz: false, writable: false }; + this.type = 'script'; + break; + case 'type': + this.type = value; + break; + default: + this.variables[name] = { value: value, kind: 'var', tdz: false, writable: false }; + } + } + if (this.type === undefined) { + this.type = 'global'; + } + } else { + this.variables = { + global: { value: this, kind: 'var', tdz: false, writable: false }, + }; + this.parent = parent; + this.type = 'global'; + // this.globalThis = this; + } + if (this.type === 'global') { + if (this.variables.global === undefined) { + this.variables.global = { value: this, kind: 'var', tdz: false, writable: false }; + } + // continueFlag的作用,所有循环在continue后要先判断再执行,do while也不例外,用continueFlag来识别是正常执行循环,还是从continue继续循环 + if (this.variables.continueFlag === undefined) { + this.variables.continueFlag = { value: false, kind: 'var', tdz: false, writable: true } + } + if (this.variables.Array === undefined) { + this.variables.Array = { value: Array, kind: 'var', tdz: false, writable: false }; + } + if (this.variables.Date === undefined) { + this.variables.Date = { value: Date, kind: 'var', tdz: false, writable: false }; + } + if (this.variables.RegExp === undefined) { + this.variables.RegExp = { value: RegExp, kind: 'var', tdz: false, writable: false }; + } + if (this.variables.JSON === undefined) { + this.variables.JSON = { value: JSON, kind: 'var', tdz: false, writable: false }; + } + } + } + + declare(kind, name) { + if (kind === 'let' || kind === 'const') { + // script和global逻辑上作为一个整体的全局作用域 + if (Object.hasOwn(this.variables, name) || (this.type === 'script' && Object.hasOwn(this.parent.variables, name))) { + throw new SyntaxError(`Cannot declare a variable twice`); + } else { + this.variables[name] = { value: undefined, kind, tdz: true, writable: true }; + } + } else if (kind === 'var') { + // find the most nearest nonblock-type scope + let scope = this; + while (scope.type === 'block' || scope.type === 'script') { + if (Object.hasOwn(scope.variables, name)) { throw new SyntaxError(`Cannot declare a variable twice`); } + scope = scope.parent; + } + // declare + if (Object.hasOwn(scope.variables, name)) { + if (scope.variables[name].kind === 'var') { + // do nothing + } else { + throw new SyntaxError(`Cannot declare a variable twice`); + } + } else { + scope.variables[name] = { value: undefined, kind, tdz: false, writable: true }; + } + } + } + + get(name) { + let scope = this; + while (scope && !Object.hasOwn(scope.variables, name)) { scope = scope.parent; } + if (!scope) { throw new ReferenceError(`Can't find variable`); } + if (scope.variables[name].tdz) { throw new ReferenceError(`Can't access variable in TDZ`); } + return scope.variables[name].value; + } + + + set(name, value, init = false) { + let scope = this; + while (scope && !Object.hasOwn(scope.variables, name)) { scope = scope.parent; } + if (!scope) { throw new ReferenceError(`Can't find variable`); } + if (init && scope.variables[name] !== 'var') { scope.freeTDZ(name); } + if (scope.variables[name].tdz) { throw new ReferenceError(`Can't access variable in TDZ`); } + if (scope.variables[name].kind === 'const' && !init) { throw new TypeError('Assignment to constant variable'); } + if (scope.variables[name].writable) { + return scope.variables[name].value = value; + } else { + // do nothing in non-strict mode + return scope.variables[name].value; + } + } + + freeTDZ(name) { + let scope = this; + while (scope && !Object.hasOwn(scope.variables, name)) { scope = scope.parent; } + if (!scope) { throw new ReferenceError(`Can't find variable`); } + scope.variables[name].tdz = false; + } + + has(name) { + let scope = this; + while (scope && !Object.hasOwn(scope.variables, name)) { scope = scope.parent; } + return scope !== undefined; + } + + getGlobalScope() { + let scope = this; + while (scope.type !== 'global') { + scope = scope.parent; + } + return scope; + } +} +class ReturnObject { + constructor(value = undefined) { + this.value = value; + } + toString() { + return 'ReturnObject{' + Object.keys(this).map(attr => `${attr}: ${this[attr]}`).join(', ') + '}' + } +} +class BreakObject { + constructor(label = undefined) { + this.label = label; + } + toString() { + return 'BreakObject{' + Object.keys(this).map(attr => `${attr}: ${this[attr]}`).join(', ') + '}' + } +} +class ContinueObject { + constructor(label = undefined) { + this.label = label; + } + toString() { + return 'ContinueObject{' + Object.keys(this).map(attr => `${attr}: ${this[attr]}`).join(', ') + '}' } } function evaluate(node, scope) { switch (node.type) { + case 'Program': + // hoist + node.body.forEach(stat => { + hoist(stat, scope, true); + }); + // execute + node.body.forEach(stat => { + evaluate(stat, scope, true); + }); + return; + + case 'Identifier': + return node.name !== 'undefined' ? scope.get(node.name) : undefined; // 坑,undefind 会被识别成 Identifier 而不是 undefinded + case 'Literal': - // TODO: 补全作业代码 + return node.value; + + case 'ArrayExpression': + return node.elements.map(e => evaluate(e, scope)); + + case 'ObjectExpression': { + const obj = {}; + node.properties.forEach(property => { + const value = evaluate(property.value, scope); + let propName; + if (property.computed) { // {[propExp]:value} + propName = evaluate(property.key, scope); + } else { // {propName:value} + propName = property.key.name; + } + if (property.value.type === 'FunctionExpression' && value instanceof Function && value.name === '') { // 特殊处理:函数表达式的name + Object.defineProperty(value, 'name', { value: propName }); + } + if (property.kind === 'init') { + obj[propName] = value; + } else if (property.kind === 'get') { + Object.defineProperty(obj, propName, { get: value }); + } else if (property.kind === 'set') { + Object.defineProperty(obj, propName, { set: value }); + } + }); + return obj; + } + + case 'MemberExpression': + return node.computed ? + evaluate(node.object, scope)[evaluate(node.property, scope)] // obj[propExp] + : evaluate(node.object, scope)[node.property.name]; // obj.propName + + case 'VariableDeclaration': + node.declarations.forEach(declaration => { + if (declaration.init) { + const value = evaluate(declaration.init, scope); + // if (declaration.init.type === 'FunctionExpression' && value instanceof Function && value.name === '') { // 特殊处理:函数表达式的name + // Object.defineProperty(value, 'name', { value: declaration.id.name }); + // } + scope.set(declaration.id.name, value, true); + } + }); + return; + + case 'ExpressionStatement': + evaluate(node.expression, scope); + return; + + case 'UpdateExpression': { + let oldValue = evaluate(node.argument, scope); + let returnValue, assignValue; + if (node.prefix && node.operator === '++') { + returnValue = oldValue + 1; + assignValue = oldValue + 1; + } else if (node.prefix && node.operator === '--') { + returnValue = oldValue - 1; + assignValue = oldValue - 1; + } else if (!node.prefix && node.operator === '++') { + returnValue = oldValue; + assignValue = oldValue + 1; + } else if (!node.prefix && node.operator === '--') { + returnValue = oldValue; + assignValue = oldValue - 1; + } + if (node.argument.type === 'MemberExpression') { // 对象属性赋值 + let obj = evaluate(node.argument.object, scope); + let propName; + if (node.argument.computed) { // obj[propExp] + propName = evaluate(node.argument.property, scope); + } else { // obj.propName + propName = node.argument.property.name; + } + obj[propName] = assignValue; + } else { + scope.set(node.argument.name, assignValue); // 变量赋值 + } + return returnValue; + } + + case 'AssignmentExpression': { + // 连续赋值时,left-value是对象属性时,提前解析(从左到右解析,从右到左赋值) + let obj; + if (node.left.type === 'MemberExpression') { + obj = evaluate(node.left.object, scope); + } + let result; + switch (node.operator) { + case '=': + // 特殊处理: 赋值语句用于声明全局变量 + if (node.left.type === 'Identifier' && !scope.has(node.left.name)) { + scope.getGlobalScope().declare('var', node.left.name); + } + result = evaluate(node.right, scope); + break; + case '+=': + result = evaluate(node.left, scope) + evaluate(node.right, scope); + break; + case '-=': + result = evaluate(node.left, scope) - evaluate(node.right, scope); + break; + case '*=': + result = evaluate(node.left, scope) * evaluate(node.right, scope); + break; + case '/=': + result = evaluate(node.left, scope) / evaluate(node.right, scope); + break; + case '%=': + result = evaluate(node.left, scope) % evaluate(node.right, scope); + break; + case '|=': + result = evaluate(node.left, scope) | evaluate(node.right, scope); + break; + case '&=': + result = evaluate(node.left, scope) & evaluate(node.right, scope); + break; + case '^=': + result = evaluate(node.left, scope) ^ evaluate(node.right, scope); + break; + case '<<=': + result = evaluate(node.left, scope) << evaluate(node.right, scope); + break; + case '>>=': + result = evaluate(node.left, scope) >> evaluate(node.right, scope); + break; + case '>>>=': + result = evaluate(node.left, scope) >>> evaluate(node.right, scope); + break; + } + if (node.left.type === 'MemberExpression') { // 对象属性赋值 + let propName; + if (node.left.computed) { // obj[propExp] + propName = evaluate(node.left.property, scope); + + } else { // obj.propName + propName = node.left.property.name; + } + // if (node.operator === '=' && node.right.type === 'FunctionExpression' && result instanceof Function && result.name === '') { // 特殊处理:函数表达式的name + // Object.defineProperty(result, 'name', { value: propName }); + // } + obj[propName] = result; + } else { + // if (node.operator === '=' && node.right.type === 'FunctionExpression' && result instanceof Function && result.name === '') { // 特殊处理:函数表达式的name + // Object.defineProperty(result, 'name', { value: node.left.name }); + // } + scope.set(node.left.name, result); // 变量赋值 + } + return result; + } + + case 'UnaryExpression': + switch (node.operator) { + case '-': return -evaluate(node.argument, scope); + case '+': return +evaluate(node.argument, scope); + case '!': return !evaluate(node.argument, scope); + case '~': return ~evaluate(node.argument, scope); + case 'typeof': + try { + return typeof evaluate(node.argument, scope); + } catch (err) { + if (err.message === `Can't find variable`) { + return 'undefined'; + } else { + // 已定义但由于TDZ无法访问的变量,使用typeof时抛出错误 + throw err; + } + } + case 'void': return void evaluate(node.argument, scope); + case 'delete': + if (node.argument.computed) { // obj[propExp] + delete evaluate(node.argument.object, scope)[evaluate(node.argument.property, scope)]; + } else { // obj.propName + delete evaluate(node.argument.object, scope)[node.argument.property.name]; + } + return; + } + + case 'BinaryExpression': + switch (node.operator) { + case '+': return evaluate(node.left, scope) + evaluate(node.right, scope); + case '-': return evaluate(node.left, scope) - evaluate(node.right, scope); + case '*': return evaluate(node.left, scope) * evaluate(node.right, scope); + case '/': return evaluate(node.left, scope) / evaluate(node.right, scope); + case '%': return evaluate(node.left, scope) % evaluate(node.right, scope); + case '**': return evaluate(node.left, scope) ** evaluate(node.right, scope); + case '<': return evaluate(node.left, scope) < evaluate(node.right, scope); + case '<=': return evaluate(node.left, scope) <= evaluate(node.right, scope); + case '>': return evaluate(node.left, scope) > evaluate(node.right, scope); + case '>=': return evaluate(node.left, scope) >= evaluate(node.right, scope); + case '==': return evaluate(node.left, scope) == evaluate(node.right, scope); + case '!=': return evaluate(node.left, scope) != evaluate(node.right, scope); + case '===': return evaluate(node.left, scope) === evaluate(node.right, scope); + case '!==': return evaluate(node.left, scope) !== evaluate(node.right, scope); + case '^': return evaluate(node.left, scope) ^ evaluate(node.right, scope); + case '&': return evaluate(node.left, scope) & evaluate(node.right, scope); + case '|': return evaluate(node.left, scope) | evaluate(node.right, scope); + case '<<': return evaluate(node.left, scope) << evaluate(node.right, scope); + case '>>': return evaluate(node.left, scope) >> evaluate(node.right, scope); + case '>>>': return evaluate(node.left, scope) >>> evaluate(node.right, scope); + case 'in': return evaluate(node.left, scope) in evaluate(node.right, scope); + case 'instanceof': return evaluate(node.left, scope) instanceof evaluate(node.right, scope); + } + + case 'LogicalExpression': + if (node.operator === '||') { + return evaluate(node.left, scope) || evaluate(node.right, scope); + } else if (node.operator === '&&') { + return evaluate(node.left, scope) && evaluate(node.right, scope); + } + + case 'ConditionalExpression': return evaluate(node.test, scope) ? evaluate(node.consequent, scope) : evaluate(node.alternate, scope); + + case 'SequenceExpression': { + let result; + for (const expr of node.expressions) { + result = evaluate(expr, scope); + } + return result; + } + + case 'FunctionExpression': { + const f = function (...args) { + const functionScope = new Scope({ type: 'function' }, scope); + functionScope.declare('var', 'thisArg'); + functionScope.set('thisArg', this); + functionScope.declare('var', 'new_target'); + functionScope.set('new_target', new.target); + for (let i = 0; i < node.params.length; i++) { + functionScope.declare('var', node.params[i].name); + functionScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); + } + node.body.body.forEach(stat => { + hoist(stat, functionScope, true); + }); + let result; + for (const stat of node.body.body) { + result = evaluate(stat, functionScope); + if (result instanceof ReturnObject) { + return result.value; + } + } + return; + } + Object.defineProperty(f, 'name', { value: node.id !== null ? node.id.name : '' }); + Object.defineProperty(f, 'length', { value: node.params.length }); + return f; + } + + case 'ArrowFunctionExpression': + if (node.body.type === 'BlockStatement') { + const f = (...args) => { + const functionScope = new Scope({ type: 'function' }, scope); + // functionScope.declare('var', 'thisArg'); + // functionScope.set('thisArg', undefined); + for (let i = 0; i < node.params.length; i++) { + functionScope.declare('var', node.params[i].name); + functionScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); + } + node.body.body.forEach(stat => { + hoist(stat, functionScope, true); + }); + let result; + for (const stat of node.body.body) { + result = evaluate(stat, functionScope); + if (result instanceof ReturnObject) { + return result.value; + } + } + return; + } + Object.defineProperty(f, 'name', { value: '' }); + Object.defineProperty(f, 'length', { value: node.params.length }); + return f; + } else { + const f = (...args) => { + const functionScope = new Scope({ type: 'function' }, scope); + // functionScope.declare('var', 'thisArg'); + // functionScope.set('thisArg', undefined); + for (let i = 0; i < node.params.length; i++) { + functionScope.declare('var', node.params[i].name); + functionScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); + } + hoist(node.body, functionScope, true); + let result = evaluate(node.body, functionScope); + return result; + }; + Object.defineProperty(f, 'name', { value: '' }); + Object.defineProperty(f, 'length', { value: node.params.length }); + return f; + } + + case 'FunctionDeclaration': { + // 函数提升时已完成定义了 + return; + } + + case 'CallExpression': { + let thisArg; + if (node.callee.type === 'MemberExpression') { // method call + thisArg = evaluate(node.callee.object, scope); + } else { // function call + thisArg = scope.getGlobalScope().get('global'); + } + return evaluate(node.callee, scope).apply(thisArg, node.arguments.map(argument => evaluate(argument, scope))); + } + + case 'NewExpression': { + const func = evaluate(node.callee, scope); + const args = node.arguments.map(argument => evaluate(argument, scope)); + // return Reflect.construct(func, args); + return new (func.bind.apply(func, [null].concat(args))); + } + + case 'MetaProperty': { + if (node.meta && node.meta.name === 'new' && node.property && node.property.name == 'target') { + return scope.get('new_target'); + } else { + break; + } + } + + + + case 'ReturnStatement': return new ReturnObject(evaluate(node.argument, scope)); + case 'BreakStatement': return new BreakObject(node.label ? node.label.name : undefined); + case 'ContinueStatement': { + // scope.set('continueFlag', true); + return new ContinueObject(node.label ? node.label.name : undefined); + } + + case 'BlockStatement': { + const blockScope = new Scope({ type: 'block' }, scope); + node.body.forEach(stat => { + hoist(stat, blockScope, true); + }); + let result; + for (const stat of node.body) { + result = evaluate(stat, blockScope); + if (result instanceof ReturnObject || result instanceof BreakObject || result instanceof ContinueObject) { + return result; + } + } + return; + } + + case 'ThisExpression': { + try { + return scope.get('thisArg'); + } catch (err) { + return undefined; + } + } + + case 'IfStatement': { + const result = evaluate(node.test, scope) ? evaluate(node.consequent, scope) : (node.alternate ? evaluate(node.alternate, scope) : undefined); + return (result instanceof ReturnObject || result instanceof BreakObject || result instanceof ContinueObject) ? result : undefined; + } + + case 'SwitchStatement': { + const switchScope = new Scope({ type: 'block' }, scope); + node.cases.forEach(switchCase => { + switchCase.consequent.forEach(stat => { + hoist(stat, switchScope, true); + }); + }); + // collect statements in matched cases + const target = evaluate(node.discriminant, scope); + const stats = []; let accept = false; + for (const switchCase of node.cases) { + if (switchCase.test === null || evaluate(switchCase.test, switchScope) === target) { + accept = true; + } + if (accept) { + stats.push(...switchCase.consequent); + } + } + // execute statements + let result; + for (const stat of stats) { + result = evaluate(stat, switchScope); + if (result instanceof ReturnObject || result instanceof ContinueObject || (result instanceof BreakObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + return; + } + } + return; + } + + case 'WhileStatement': { + if (scope.get('continueFlag')) { scope.set('continueFlag', false); } + let result; + while (evaluate(node.test, scope)) { + result = evaluate(node.body, scope); + if (result instanceof ReturnObject || (result instanceof BreakObject && result.label !== undefined) || (result instanceof ContinueObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + break; + } else if (result instanceof ContinueObject && result.label === undefined) { + continue; + } + } + return; + } + + case 'DoWhileStatement': { + if (scope.get('continueFlag')) { + scope.set('continueFlag', false); + let result; + while (evaluate(node.test, scope)) { + result = evaluate(node.body, scope); + if (result instanceof ReturnObject || (result instanceof BreakObject && result.label !== undefined) || (result instanceof ContinueObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + break; + } else if (result instanceof ContinueObject && result.label === undefined) { + continue; + } + } + return; + } else { + let result; + do { + result = evaluate(node.body, scope); + if (result instanceof ReturnObject || (result instanceof BreakObject && result.label !== undefined) || (result instanceof ContinueObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + break; + } else if (result instanceof ContinueObject && result.label === undefined) { + continue; + } + } while (evaluate(node.test, scope)); + return; + } + } + + case 'ForStatement': { + if (scope.get('continueFlag')) { + scope.set('continueFlag', false); + const forScope = new Scope({ type: 'block' }, scope); + if (node.init) { hoist(node.init, forScope, true); } + if (node.test) { hoist(node.test, forScope, true); } + if (node.update) { hoist(node.update, forScope, true); } + if (node.body) { hoist(node.body, forScope, true); } + let result; + if (node.update) { evaluate(node.update, forScope); } + while (node.test === null || evaluate(node.test, forScope)) { + result = evaluate(node.body, forScope); + if (result instanceof ReturnObject || (result instanceof BreakObject && result.label !== undefined) || (result instanceof ContinueObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + break; + } else if (result instanceof ContinueObject && result.label === undefined) { + continue; + } + if (node.update) { evaluate(node.update, forScope); } + } + return; + + + + } else { + const forScope = new Scope({ type: 'block' }, scope); + if (node.init) { hoist(node.init, forScope, true); } + if (node.test) { hoist(node.test, forScope, true); } + if (node.update) { hoist(node.update, forScope, true); } + if (node.body) { hoist(node.body, forScope, true); } + let result; + if (node.init) { evaluate(node.init, forScope); } + while (node.test === null || evaluate(node.test, forScope)) { + result = evaluate(node.body, forScope); + if (result instanceof ReturnObject || (result instanceof BreakObject && result.label !== undefined) || (result instanceof ContinueObject && result.label !== undefined)) { + return result; + } else if (result instanceof BreakObject && result.label === undefined) { + break; + } else if (result instanceof ContinueObject && result.label === undefined) { + continue; + } + if (node.update) { evaluate(node.update, forScope); } + } + return; + } + // let tmp, result; + // for ( + // let blockScope = (tmp = new Scope('block', scope), node.init !== null ? evaluate(node.init, tmp) : 0, tmp); + // node.test === null || evaluate(node.test, blockScope); + // node.update !== null ? evaluate(node.update, blockScope) : 0 + // ) { + // result = evaluate(node.body, blockScope); + // if (result instanceof ReturnObject || (result instanceof BreakObject && result.label !== undefined) || (result instanceof ContinueObject && result.label !== undefined)) { + // return result; + // } else if (result instanceof BreakObject && result.label === undefined) { + // break; + // } else if (result instanceof ContinueObject && result.label === undefined) { + // continue; + // } + // } + return; + } + + case 'LabeledStatement': { + // 注:label常用于循环语句,也可用于其他语句(语句块),不可用于声明。break label可以跳出非循环语句(语句块等),continue label必须是循环语句的label + let result = evaluate(node.body, scope); + while (result instanceof ContinueObject && result.label === node.label.name) { + scope.set('continueFlag', true); + result = evaluate(node.body, scope); + } + if (result instanceof ReturnObject || (result instanceof ContinueObject && result.label !== node.label.name) || (result instanceof BreakObject && result.label !== node.label.name)) { + return result; + } else if (result instanceof BreakObject && result.label === node.label.name) { + return; + } + return; + } + + case 'ThrowStatement': throw evaluate(node.argument, scope); + + case 'TryStatement': { + let result; + try { + result = evaluate(node.block, scope); + } catch (err) { + if (node.handler !== null) { + const catchScope = new Scope({ type: 'block' }, scope); + // hoist skip, becase 'err' contain nothing about hoist + catchScope.declare('let', node.handler.param.name); + catchScope.set(node.handler.param.name, err, true); + result = evaluate(node.handler.body, catchScope); + } + } finally { + if (node.finalizer !== null) { + const finalizerResult = evaluate(node.finalizer, scope); + if (finalizerResult !== undefined) { + result = finalizerResult; + } + } + return result; + } + } + + } throw new Error(`Unsupported Syntax ${node.type} at Location ${node.start}:${node.end}`); } +function hoist(node, scope, inScope) { + switch (node.type) { + case 'FunctionDeclaration': { + let declareScope; + if (inScope && scope.type === 'block') { + // do nothing + } else if (inScope && scope.type === 'function') { + declareScope = scope; + } else if (inScope && scope.type === 'script') { + declareScope = scope.parent; + } else if (!inScope && scope.type === 'block') { + // impossible + } else if (!inScope && scope.type === 'function') { + declareScope = scope; + } else if (!inScope && scope.type === 'script') { + declareScope = scope.parent; + } + if (declareScope !== undefined) { + declareScope.declare('var', node.id.name); + const f = function (...args) { + const functionScope = new Scope({ type: 'function' }, scope); + functionScope.declare('var', 'thisArg'); + functionScope.set('thisArg', this); + functionScope.declare('var', 'new_target'); + functionScope.set('new_target', new.target); + for (let i = 0; i < node.params.length; i++) { + functionScope.declare('var', node.params[i].name); + functionScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); + } + node.body.body.forEach(stat => { + hoist(stat, functionScope, true); + }); + let result; + for (const stat of node.body.body) { + result = evaluate(stat, functionScope); + if (result instanceof ReturnObject) { + return result.value; + } + } + return; + } + Object.defineProperty(f, 'name', { value: node.id.name }); + Object.defineProperty(f, 'length', { value: node.params.length }); + declareScope.set(node.id.name, f, true); + } + break; + } + case 'VariableDeclaration': + node.declarations.forEach(declaration => { + if (inScope && scope.type === 'block' && node.kind === 'var') { + // do nothing + } else if (inScope && scope.type === 'block' && node.kind !== 'var') { + scope.declare(node.kind, declaration.id.name); + } else if (inScope && scope.type === 'function' && node.kind === 'var') { + scope.declare(node.kind, declaration.id.name); + } else if (inScope && scope.type === 'function' && node.kind !== 'var') { + scope.declare(node.kind, declaration.id.name); + } else if (inScope && scope.type === 'script' && node.kind === 'var') { + scope.parent.declare(node.kind, declaration.id.name); + } else if (inScope && scope.type === 'script' && node.kind !== 'var') { + scope.declare(node.kind, declaration.id.name); + } else if (!inScope && scope.type === 'block' && node.kind === 'var') { + // impossible + } else if (!inScope && scope.type === 'block' && node.kind !== 'var') { + // impossible + } else if (!inScope && scope.type === 'function' && node.kind === 'var') { + scope.declare(node.kind, declaration.id.name); + } else if (!inScope && scope.type === 'function' && node.kind !== 'var') { + // do nothing + } else if (!inScope && scope.type === 'script' && node.kind === 'var') { + scope.parent.declare(node.kind, declaration.id.name); + } else if (!inScope && scope.type === 'script' && node.kind !== 'var') { + // do nothing + } + }); + break; + case 'BlockStatement': + if (scope.type === 'block') { + // do nothing + } else if (scope.type === 'function') { + node.body.forEach(stat => { + hoist(stat, scope, false); + }); + } else if (scope.type === 'script') { + node.body.forEach(stat => { + hoist(stat, scope, false); + }); + } + break; + case 'IfStatement': + if (scope.type === 'block') { + if (node.consequent.type === 'BlockStatement') { + // do nothing + } else { + hoist(node.consequent, scope, true); + } + if (node.alternate) { + if (node.alternate.type === 'BlockStatement') { + // do nothing + } else { + hoist(node.alternate, scope, true); + } + } + } else if (scope.type === 'function' || scope.type === 'script') { + hoist(node.consequent, scope, true); + if (node.alternate) { + hoist(node.alternate, scope, true); + } + } + break; + case 'SwitchStatement': + if (scope.type === 'block') { + // do nothing + } else if (scope.type === 'function' || scope.type === 'script') { + node.cases.forEach(switchCase => { + switchCase.consequent.forEach(stat => { + hoist(stat, scope, false); + }); + }); + } + break; + case 'WhileStatement': + case 'DoWhileStatement': + if (scope.type === 'block') { + if (node.body.type === 'BlockStatement') { + // do nothing + } else { + hoist(node.body, scope, true); + } + } else if (scope.type === 'function' || scope.type === 'script') { + hoist(node.body, scope, true); + } + break; + case 'ForStatement': + if (scope.type === 'block') { + // do nothing + } else if (scope.type === 'function' || scope.type === 'script') { + if (node.init) { hoist(node.init, scope, false); } + if (node.test) { hoist(node.test, scope, false); } + if (node.update) { hoist(node.update, scope, false); } + if (node.body) { hoist(node.body, scope, false); } + } + break; + case 'LabeledStatement': + hoist(node.body, scope, true); + break; + case 'FunctionExpression': break; + case 'ArrowFunctionExpression': break; + case 'TryStatement': { + if (scope.type === 'block') { + // do nothing + } else if (scope.type === 'function' || scope.type === 'script') { + hoist(node.block, scope, true); + if (node.handler) { hoist(node.handler.body, scope, false); } + if (node.finalizer) { hoist(node.finalizer, scope, true); } + } + break; + } + + default: break; // do nothing + } +} + function customEval(code, parent) { const scope = new Scope({ @@ -23,7 +890,7 @@ function customEval(code, parent) { }, parent); const node = acorn.parse(code, { - ecmaVersion: 6 + ecmaVersion: 7 // ES7开始才全面支持**运算符 }) evaluate(node, scope); diff --git a/final/test/sequence/SequenceExpression.test.js b/final/test/sequence/SequenceExpression.test.js index 3c4ead2..3577ff7 100644 --- a/final/test/sequence/SequenceExpression.test.js +++ b/final/test/sequence/SequenceExpression.test.js @@ -33,5 +33,6 @@ module.exports = {a: a, b: b}; scope ); t.deepEqual(a, 2); - t.deepEqual(b, undefined); + // t.deepEqual(b, undefined); + t.deepEqual(b, 3); }); \ No newline at end of file diff --git a/final/test/stack-track.test.js b/final/test/stack-track.test.js index ac6078b..0175429 100644 --- a/final/test/stack-track.test.js +++ b/final/test/stack-track.test.js @@ -17,5 +17,6 @@ get();`, t.fail("it should throw an error"); } catch (err) { // ignore + t.pass("it has thrown an error") } }); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a6b7045 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3014 @@ +{ + "name": "jsjs-homework", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "jsjs-homework", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "acorn": "^8.7.0", + "astring": "^1.8.1", + "ava": "^4.0.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astring": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.3.tgz", + "integrity": "sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/ava": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/ava/-/ava-4.3.3.tgz", + "integrity": "sha512-9Egq/d9R74ExrWohHeqUlexjDbgZJX5jA1Wq4KCTqc3wIfpGEK79zVy4rBtofJ9YKIxs4PzhJ8BgbW5PlAYe6w==", + "dependencies": { + "acorn": "^8.7.1", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.1.0", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.0.1", + "chokidar": "^3.5.3", + "chunkd": "^2.0.1", + "ci-info": "^3.3.1", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.4", + "del": "^6.1.1", + "emittery": "^0.11.0", + "figures": "^4.0.1", + "globby": "^13.1.1", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", + "ms": "^2.1.3", + "p-event": "^5.0.1", + "p-map": "^5.4.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^7.0.1", + "resolve-cwd": "^3.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.5", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^2.0.0", + "write-file-atomic": "^4.0.1", + "yargs": "^17.5.1" + }, + "bin": { + "ava": "entrypoints/cli.mjs" + }, + "engines": { + "node": ">=12.22 <13 || >=14.17 <15 || >=16.4 <17 || >=18" + }, + "peerDependencies": { + "@ava/typescript": "*" + }, + "peerDependenciesMeta": { + "@ava/typescript": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.0.0.tgz", + "integrity": "sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chunkd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==" + }, + "node_modules/ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==" + }, + "node_modules/ci-parallel-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==" + }, + "node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concordance": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", + "dependencies": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + }, + "engines": { + "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" + } + }, + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/del/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emittery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.11.0.tgz", + "integrity": "sha512-S/7tzL6v5i+4iJd627Nhv9cLFIo5weAIlGccqJFpnBoDB8U1TF2k5tez4J/QNuxyyhWuFqHg1L84Kd3m7iXg6g==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", + "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", + "engines": { + "node": ">=10 <11 || >=12 <13 || >=14" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/irregular-plurals": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", + "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "node_modules/is-unicode-supported": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", + "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/matcher": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dependencies": { + "blueimp-md5": "^2.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mem": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "engines": { + "node": ">=12.19" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "dependencies": { + "p-timeout": "^5.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "dependencies": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "dependencies": { + "irregular-plurals": "^3.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "dependencies": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "requires": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + } + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==" + }, + "arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==" + }, + "astring": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.3.tgz", + "integrity": "sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==" + }, + "ava": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/ava/-/ava-4.3.3.tgz", + "integrity": "sha512-9Egq/d9R74ExrWohHeqUlexjDbgZJX5jA1Wq4KCTqc3wIfpGEK79zVy4rBtofJ9YKIxs4PzhJ8BgbW5PlAYe6w==", + "requires": { + "acorn": "^8.7.1", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.1.0", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.0.1", + "chokidar": "^3.5.3", + "chunkd": "^2.0.1", + "ci-info": "^3.3.1", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.4", + "del": "^6.1.1", + "emittery": "^0.11.0", + "figures": "^4.0.1", + "globby": "^13.1.1", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", + "ms": "^2.1.3", + "p-event": "^5.0.1", + "p-map": "^5.4.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^7.0.1", + "resolve-cwd": "^3.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.5", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^2.0.0", + "write-file-atomic": "^4.0.1", + "yargs": "^17.5.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "callsites": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.0.0.tgz", + "integrity": "sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==" + }, + "cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "requires": { + "nofilter": "^3.1.0" + } + }, + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chunkd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==" + }, + "ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==" + }, + "ci-parallel-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==" + }, + "clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "requires": { + "escape-string-regexp": "5.0.0" + } + }, + "clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==" + }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "requires": { + "convert-to-spaces": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concordance": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", + "requires": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + } + }, + "convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "requires": { + "time-zone": "^1.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "dependencies": { + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "emittery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.11.0.tgz", + "integrity": "sha512-S/7tzL6v5i+4iJd627Nhv9cLFIo5weAIlGccqJFpnBoDB8U1TF2k5tez4J/QNuxyyhWuFqHg1L84Kd3m7iXg6g==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "figures": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", + "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", + "requires": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "dependencies": { + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + } + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + }, + "ignore-by-default": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "irregular-plurals": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", + "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "is-unicode-supported": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", + "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==" + }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==" + }, + "locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "requires": { + "p-locate": "^6.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "matcher": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", + "requires": { + "escape-string-regexp": "^5.0.0" + } + }, + "md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "requires": { + "blueimp-md5": "^2.10.0" + } + }, + "mem": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==" + }, + "p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "requires": { + "p-timeout": "^5.0.2" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "requires": { + "p-limit": "^4.0.0" + } + }, + "p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "requires": { + "aggregate-error": "^4.0.0" + } + }, + "p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==" + }, + "parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "requires": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + } + }, + "plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "requires": { + "irregular-plurals": "^3.3.0" + } + }, + "pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "requires": { + "parse-ms": "^2.1.0" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "requires": { + "type-fest": "^0.13.1" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "requires": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" + } + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" + }, + "well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==" + } + } +} From 256454977d1ef70ede4541cdbf44114335b1f2b5 Mon Sep 17 00:00:00 2001 From: zhhsh Date: Fri, 30 Sep 2022 05:48:13 +0800 Subject: [PATCH 5/5] final - commit 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完成generator部分 --- final/eval.js | 345 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 257 insertions(+), 88 deletions(-) diff --git a/final/eval.js b/final/eval.js index 4f154ce..af03c43 100644 --- a/final/eval.js +++ b/final/eval.js @@ -19,7 +19,7 @@ class Scope { this.type = value; break; default: - this.variables[name] = { value: value, kind: 'var', tdz: false, writable: false }; + this.variables[name] = { value: value, kind: 'var', tdz: false, writable: true }; } } if (this.type === undefined) { @@ -133,24 +133,20 @@ class ReturnObject { constructor(value = undefined) { this.value = value; } - toString() { - return 'ReturnObject{' + Object.keys(this).map(attr => `${attr}: ${this[attr]}`).join(', ') + '}' - } } class BreakObject { constructor(label = undefined) { this.label = label; } - toString() { - return 'BreakObject{' + Object.keys(this).map(attr => `${attr}: ${this[attr]}`).join(', ') + '}' - } } class ContinueObject { constructor(label = undefined) { this.label = label; } - toString() { - return 'ContinueObject{' + Object.keys(this).map(attr => `${attr}: ${this[attr]}`).join(', ') + '}' +} +class YieldObject { + constructor(yeildValue) { + this.yeildValue = yeildValue; } } @@ -206,20 +202,22 @@ function evaluate(node, scope) { : evaluate(node.object, scope)[node.property.name]; // obj.propName case 'VariableDeclaration': - node.declarations.forEach(declaration => { + for (const declaration of node.declarations) { if (declaration.init) { const value = evaluate(declaration.init, scope); // if (declaration.init.type === 'FunctionExpression' && value instanceof Function && value.name === '') { // 特殊处理:函数表达式的name // Object.defineProperty(value, 'name', { value: declaration.id.name }); // } + if (value instanceof YieldObject) { + return value; + } scope.set(declaration.id.name, value, true); } - }); + } return; case 'ExpressionStatement': - evaluate(node.expression, scope); - return; + return evaluate(node.expression, scope); case 'UpdateExpression': { let oldValue = evaluate(node.argument, scope); @@ -322,15 +320,30 @@ function evaluate(node, scope) { return result; } - case 'UnaryExpression': + case 'UnaryExpression': { + let op; switch (node.operator) { - case '-': return -evaluate(node.argument, scope); - case '+': return +evaluate(node.argument, scope); - case '!': return !evaluate(node.argument, scope); - case '~': return ~evaluate(node.argument, scope); + case '-': + op = evaluate(node.argument, scope); + if (op instanceof YieldObject) { return op; } + return -op; + case '+': + op = evaluate(node.argument, scope); + if (op instanceof YieldObject) { return op; } + return +op; + case '!': + op = evaluate(node.argument, scope); + if (op instanceof YieldObject) { return op; } + return !op; + case '~': + op = evaluate(node.argument, scope); + if (op instanceof YieldObject) { return op; } + return ~op; case 'typeof': try { - return typeof evaluate(node.argument, scope); + op = evaluate(node.argument, scope); + if (op instanceof YieldObject) { return op; } + return typeof op; } catch (err) { if (err.message === `Can't find variable`) { return 'undefined'; @@ -339,41 +352,56 @@ function evaluate(node, scope) { throw err; } } - case 'void': return void evaluate(node.argument, scope); + case 'void': + op = evaluate(node.argument, scope); + if (op instanceof YieldObject) { return op; } + return void op; case 'delete': + const obj = evaluate(node.argument.object, scope); + if (obj instanceof YieldObject) { return obj; } + let propName; if (node.argument.computed) { // obj[propExp] - delete evaluate(node.argument.object, scope)[evaluate(node.argument.property, scope)]; + propName = evaluate(node.argument.property, scope); } else { // obj.propName - delete evaluate(node.argument.object, scope)[node.argument.property.name]; + propName = node.argument.property.name; } + if (propName instanceof YieldObject) { return propName; } + delete obj[propName]; return; } + } - case 'BinaryExpression': + case 'BinaryExpression': { + const op1 = evaluate(node.left, scope); + if (op1 instanceof YieldObject) { return op1; } + const op2 = evaluate(node.right, scope); + if (op2 instanceof YieldObject) { return op2; } switch (node.operator) { - case '+': return evaluate(node.left, scope) + evaluate(node.right, scope); - case '-': return evaluate(node.left, scope) - evaluate(node.right, scope); - case '*': return evaluate(node.left, scope) * evaluate(node.right, scope); - case '/': return evaluate(node.left, scope) / evaluate(node.right, scope); - case '%': return evaluate(node.left, scope) % evaluate(node.right, scope); - case '**': return evaluate(node.left, scope) ** evaluate(node.right, scope); - case '<': return evaluate(node.left, scope) < evaluate(node.right, scope); - case '<=': return evaluate(node.left, scope) <= evaluate(node.right, scope); - case '>': return evaluate(node.left, scope) > evaluate(node.right, scope); - case '>=': return evaluate(node.left, scope) >= evaluate(node.right, scope); - case '==': return evaluate(node.left, scope) == evaluate(node.right, scope); - case '!=': return evaluate(node.left, scope) != evaluate(node.right, scope); - case '===': return evaluate(node.left, scope) === evaluate(node.right, scope); - case '!==': return evaluate(node.left, scope) !== evaluate(node.right, scope); - case '^': return evaluate(node.left, scope) ^ evaluate(node.right, scope); - case '&': return evaluate(node.left, scope) & evaluate(node.right, scope); - case '|': return evaluate(node.left, scope) | evaluate(node.right, scope); - case '<<': return evaluate(node.left, scope) << evaluate(node.right, scope); - case '>>': return evaluate(node.left, scope) >> evaluate(node.right, scope); - case '>>>': return evaluate(node.left, scope) >>> evaluate(node.right, scope); - case 'in': return evaluate(node.left, scope) in evaluate(node.right, scope); - case 'instanceof': return evaluate(node.left, scope) instanceof evaluate(node.right, scope); + case '+': return op1 + op2; + case '-': return op1 - op2; + case '*': return op1 * op2; + case '/': return op1 / op2; + case '%': return op1 % op2; + case '**': return op1 ** op2; + case '<': return op1 < op2; + case '<=': return op1 <= op2; + case '>': return op1 > op2; + case '>=': return op1 >= op2; + case '==': return op1 == op2; + case '!=': return op1 != op2; + case '===': return op1 === op2; + case '!==': return op1 !== op2; + case '^': return op1 ^ op2; + case '&': return op1 & op2; + case '|': return op1 | op2; + case '<<': return op1 << op2; + case '>>': return op1 >> op2; + case '>>>': return op1 >>> op2; + case 'in': return op1 in op2; + case 'instanceof': return op1 instanceof op2; } + } + case 'LogicalExpression': if (node.operator === '||') { @@ -393,31 +421,105 @@ function evaluate(node, scope) { } case 'FunctionExpression': { - const f = function (...args) { - const functionScope = new Scope({ type: 'function' }, scope); - functionScope.declare('var', 'thisArg'); - functionScope.set('thisArg', this); - functionScope.declare('var', 'new_target'); - functionScope.set('new_target', new.target); - for (let i = 0; i < node.params.length; i++) { - functionScope.declare('var', node.params[i].name); - functionScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); + if (!node.generator) { + const f = function (...args) { + const functionScope = new Scope({ type: 'function' }, scope); + functionScope.declare('var', 'thisArg'); + functionScope.set('thisArg', this); + functionScope.declare('var', 'new_target'); + functionScope.set('new_target', new.target); + for (let i = 0; i < node.params.length; i++) { + functionScope.declare('var', node.params[i].name); + functionScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); + } + node.body.body.forEach(stat => { + hoist(stat, functionScope, true); + }); + let result; + for (const stat of node.body.body) { + result = evaluate(stat, functionScope); + if (result instanceof ReturnObject) { + return result.value; + } + } + return; } - node.body.body.forEach(stat => { - hoist(stat, functionScope, true); - }); - let result; - for (const stat of node.body.body) { - result = evaluate(stat, functionScope); - if (result instanceof ReturnObject) { - return result.value; + Object.defineProperty(f, 'name', { value: node.id !== null ? node.id.name : '' }); + Object.defineProperty(f, 'length', { value: node.params.length }); + return f; + } else { // generator + return function (...args) { + const genScope = new Scope({ type: 'function' }, scope); + for (let i = 0; i < node.params.length; i++) { + genScope.declare('var', node.params[i].name); + genScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); } + node.body.body.forEach(stat => { + hoist(stat, genScope, true); + }); + genScope.declare('var', 'yieldType'); + const genObj = { + genScope, // 作用域 + stats: node.body.body, // 函数体 + idx: undefined, // 上次退出的位置 + closed: false, // 是否执行完毕 + next(arg) { + if (this.closed) { + return { value: undefined, done: true }; + } else { + if (this.idx === undefined) { // 首次执行 + // 第一次不会接收arg + // 执行直到yield或return + this.genScope.set('yieldType', 'exit'); + let result; + for (let i = 0; i < this.stats.length; i++) { + result = evaluate(this.stats[i], this.genScope); + if (result instanceof ReturnObject) { + this.closed = true; + return { value: result.value, done: true }; + } else if (result instanceof YieldObject) { + this.idx = i; + return { value: result.yeildValue, done: false }; + } + } + this.closed = true; + return { value: undefined, done: true }; + } else { // 继续执行 + this.genScope.declare('var', 'arg'); + this.genScope.set('arg', arg); + // 从yield进入 + this.genScope.set('yieldType', 'enter'); + evaluate(this.stats[i], this.genScope); + // 执行直到yield或return + this.genScope.set('yieldType', 'exit'); + for (let i = this.idx + 1; i < this.stats.length; i++) { + result = evaluate(this.stats[i], this.genScope); + if (result instanceof ReturnObject) { + this.closed = true; + return { value: result.value, done: true }; + } else if (result instanceof YieldObject) { + this.idx = i; + return { value: result.yeildValue, done: false }; + } + } + this.closed = true; + return { value: undefined, done: true }; + } + } + } + } + return genObj; } - return; } - Object.defineProperty(f, 'name', { value: node.id !== null ? node.id.name : '' }); - Object.defineProperty(f, 'length', { value: node.params.length }); - return f; + } + + case 'YieldExpression': { + const type = scope.get('yieldType'); + if (type === 'exit') { // 从yield退出 + return new YieldObject(evaluate(node.argument, scope)); + } else if (type === 'enter') { // 从yield进入 + return scope.get('arg'); + } } case 'ArrowFunctionExpression': @@ -736,32 +838,99 @@ function hoist(node, scope, inScope) { declareScope = scope.parent; } if (declareScope !== undefined) { - declareScope.declare('var', node.id.name); - const f = function (...args) { - const functionScope = new Scope({ type: 'function' }, scope); - functionScope.declare('var', 'thisArg'); - functionScope.set('thisArg', this); - functionScope.declare('var', 'new_target'); - functionScope.set('new_target', new.target); - for (let i = 0; i < node.params.length; i++) { - functionScope.declare('var', node.params[i].name); - functionScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); + if (!node.generator) { + declareScope.declare('var', node.id.name); + const f = function (...args) { + const functionScope = new Scope({ type: 'function' }, scope); + functionScope.declare('var', 'thisArg'); + functionScope.set('thisArg', this); + functionScope.declare('var', 'new_target'); + functionScope.set('new_target', new.target); + for (let i = 0; i < node.params.length; i++) { + functionScope.declare('var', node.params[i].name); + functionScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); + } + node.body.body.forEach(stat => { + hoist(stat, functionScope, true); + }); + let result; + for (const stat of node.body.body) { + result = evaluate(stat, functionScope); + if (result instanceof ReturnObject) { + return result.value; + } + } + return; } - node.body.body.forEach(stat => { - hoist(stat, functionScope, true); - }); - let result; - for (const stat of node.body.body) { - result = evaluate(stat, functionScope); - if (result instanceof ReturnObject) { - return result.value; + Object.defineProperty(f, 'name', { value: node.id.name }); + Object.defineProperty(f, 'length', { value: node.params.length }); + declareScope.set(node.id.name, f, true); + } else { // generator + declareScope.declare('var', node.id.name); + const f = function (...args) { + const genScope = new Scope({ type: 'function' }, scope); + for (let i = 0; i < node.params.length; i++) { + genScope.declare('var', node.params[i].name); + genScope.set(node.params[i].name, i < args.length ? args[i] : undefined, true); + } + node.body.body.forEach(stat => { + hoist(stat, genScope, true); + }); + genScope.declare('var', 'yieldType'); + const genObj = { + genScope, // 作用域 + stats: node.body.body, // 函数体 + idx: undefined, // 上次退出的位置 + closed: false, // 是否执行完毕 + next(arg) { + if (this.closed) { + return { value: undefined, done: true }; + } else { + if (this.idx === undefined) { // 首次执行 + // 第一次不会接收arg + // 执行直到yield或return + this.genScope.set('yieldType', 'exit'); + let result; + for (let i = 0; i < this.stats.length; i++) { + result = evaluate(this.stats[i], this.genScope); + if (result instanceof ReturnObject) { + this.closed = true; + return { value: result.value, done: true }; + } else if (result instanceof YieldObject) { + this.idx = i; + return { value: result.yeildValue, done: false }; + } + } + this.closed = true; + return { value: undefined, done: true }; + } else { // 继续执行 + this.genScope.declare('var', 'arg'); + this.genScope.set('arg', arg); + // 从yield进入 + this.genScope.set('yieldType', 'enter'); + evaluate(this.stats[this.idx], this.genScope); + // 执行直到yield或return + this.genScope.set('yieldType', 'exit'); + for (let i = this.idx + 1; i < this.stats.length; i++) { + result = evaluate(this.stats[i], this.genScope); + if (result instanceof ReturnObject) { + this.closed = true; + return { value: result.value, done: true }; + } else if (result instanceof YieldObject) { + this.idx = i; + return { value: result.yeildValue, done: false }; + } + } + this.closed = true; + return { value: undefined, done: true }; + } + } + } } + return genObj; } - return; + declareScope.set(node.id.name, f, true); } - Object.defineProperty(f, 'name', { value: node.id.name }); - Object.defineProperty(f, 'length', { value: node.params.length }); - declareScope.set(node.id.name, f, true); } break; }