From e1c27ec8bed3a18a2f76b5fca28630163e3162f5 Mon Sep 17 00:00:00 2001 From: Regev Brody Date: Tue, 28 Feb 2023 00:19:10 +0200 Subject: [PATCH] add custom function run opts (#28) --- .github/workflows/ci.yml | 4 +- .run/Template Mocha.run.xml | 14 + README.md | 205 +- package.json | 35 +- src/examples/engine/example.ts | 2 +- src/examples/engine/lib/engine.ts | 7 +- .../engine/lib/functions/counterFunc.ts | 3 +- src/examples/engine/lib/functions/userFunc.ts | 3 +- src/examples/engine/lib/rules/userRule.ts | 3 +- src/examples/evaluator/example.ts | 11 +- src/examples/evaluator/lib/evaluator.ts | 8 +- .../evaluator/lib/functions/counterFunc.ts | 3 +- .../evaluator/lib/functions/userFunc.ts | 3 +- src/lib/engine.ts | 66 +- src/lib/evaluator.ts | 67 +- src/lib/expressionHandler.ts | 17 +- src/lib/rulesEngine.ts | 30 +- src/lib/typeGuards.ts | 34 +- src/test/.mocharc.json | 9 + src/test/engine.spec.ts | 407 +++- src/test/evaluator.spec.ts | 557 +++-- src/test/mocha.opts | 5 - src/test/types/deep.test-d.ts | 10 +- src/test/types/evaluator.test-d.ts | 186 +- src/test/types/expressionParts.ts | 5 +- src/types/engine.ts | 33 +- src/types/evaluator.ts | 48 +- src/types/expressionParts.ts | 14 +- tsconfig.json | 4 +- yarn.lock | 2006 ++++++++--------- 30 files changed, 2158 insertions(+), 1641 deletions(-) create mode 100644 .run/Template Mocha.run.xml create mode 100644 src/test/.mocharc.json delete mode 100644 src/test/mocha.opts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d3e713..e64547c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: os: [ ubuntu-latest ] - node-version: [ 6.x, 8.x, 10.x, 12.x, 14.x, 16.x, 18.x ] + node-version: [ 14.x, 16.x, 18.x, 19.x ] steps: @@ -92,7 +92,7 @@ jobs: strategy: matrix: os: [ ubuntu-latest ] - node-version: [ 6.x ] + node-version: [ 18.x ] needs: [ test ] if: github.event_name == 'release' && github.event.action == 'published' steps: diff --git a/.run/Template Mocha.run.xml b/.run/Template Mocha.run.xml new file mode 100644 index 0000000..2d45b6a --- /dev/null +++ b/.run/Template Mocha.run.xml @@ -0,0 +1,14 @@ + + + project + + $PROJECT_DIR$ + true + + --config src/test/.mocharc.json + DIRECTORY + + false + + + \ No newline at end of file diff --git a/README.md b/README.md index a0dc5a4..5fb1450 100644 --- a/README.md +++ b/README.md @@ -47,11 +47,14 @@ interface IExampleContext { type IExampleContextIgnore = Moment; +type IExampleCustomEvaluatorFuncRunOptions = {dryRun: boolean}; + type IExampleFunctionTable = { - countRange: ([min, max]: [min: number, max: number], ctx: { times: number | undefined }) => boolean; + countRange: ([min, max]: [min: number, max: number], ctx: { times: number | undefined }, + runOpts: EvaluatorFuncRunOptions) => Promise; } -type IExampleExpression = Expression; // We pass Moment here to avoid TS exhaustion +type IExampleExpression = Expression; // We pass Moment here to avoid TS exhaustion const context: IExampleContext = { userId: 'a@b.com', @@ -82,7 +85,8 @@ const validationContext: ValidationContext => { + countRange: async ([min, max]: [min: number, max: number], ctx: { times: number | undefined }, + runOpts: EvaluatorFuncRunOptions): Promise => { return ctx.times === undefined ? false : ctx.times >= min && ctx.times < max; }, }; @@ -97,7 +101,7 @@ const expression: IExampleExpression = { lte: { op: '+', lhs: { - ref: 'nested.value4' + ref: 'nested.value4', }, rhs: 2, }, @@ -114,8 +118,8 @@ const expression: IExampleExpression = { { times: { lte: { - ref: 'nested.value4' - } + ref: 'nested.value4', + }, }, }, ], @@ -123,15 +127,19 @@ const expression: IExampleExpression = { ], }; -// Example usage 1 -const handler = - new ExpressionHandler(expression, functionsTable); -await handler.validate(validationContext); // Should not throw -console.log(await handler.evaluate(context)); // true - -// Example usage 2 -await validate(expression, validationContext, functionsTable); // Should not throw -console.log(await evaluate(expression, context, functionsTable)); // true +(async () => { + // Example usage 1 + const handler = + new ExpressionHandler(expression, functionsTable); + await handler.validate(validationContext, {dryRun: false}); // Should not throw + console.log(await handler.evaluate(context, {dryRun: true})); // true + + // Example usage 2 + await validate(expression, validationContext, functionsTable, {dryRun: true}); // Should not throw + console.log(await evaluate(expression, context, functionsTable, {dryRun: true})); // true +})() ``` ### Expression @@ -140,7 +148,7 @@ There are 4 types of operators you can use (evaluated in that order of precedenc - `and` - accepts a non-empty list of expressions - `or` - accepts a non-empty list of expressions - `not` - accepts another expressions -- `` - accepts any type of argument and evaluated by the user defined functions, and the given context (can be async) and run options (i.e. validation). +- `` - accepts any type of argument and evaluated by the user defined functions, and the given context (can be async) and run options (i.e. validation + custom defined value). - `` - operates on one of the context properties and compares it to a given value. - `{property: {op: value}}` - available ops: @@ -217,120 +225,133 @@ Example expressions, assuming we have the `user` and `maxCount` user defined fun *Please see tests and examples dir for more usages and examples (under /src)* ```typescript -import {ValidationContext, validateRules, evaluateRules, RulesEngine, Rule, ResolvedConsequence, EngineRuleFuncRunOptions, EvaluatorFuncRunOptions} from 'json-expression-eval'; +import {ValidationContext, validateRules, evaluateRules, RulesEngine, Rule, ResolvedConsequence, EngineRuleFuncRunOptions} from 'json-expression-eval'; import {Moment} from 'moment'; import moment = require('moment'); interface IExampleContext { - userId: string; - times: number | undefined; - date: Moment; - nested: { - value: number | null; - nested2: { - value2?: number; - value3: boolean; + userId: string; + times: number | undefined; + date: Moment; + nested: { + value: number | null; + nested2: { + value2?: number; + value3: boolean; + }; }; - }; } type IExampleContextIgnore = Moment; + +type IExampleCustomEngineRuleFuncRunOptions = {dryRun: boolean}; + type IExamplePayload = number; type IExampleFunctionTable = { - countRange: ([min, max]: [min: number, max: number], ctx: { times: number | undefined }, runOptions: EvaluatorFuncRunOptions) => boolean; + countRange: ([min, max]: [min: number, max: number], ctx: { times: number | undefined }, + runOpts: EngineRuleFuncRunOptions) => boolean; } type IExampleRuleFunctionTable = { - userRule: (user: string, ctx: IExampleContext, runOptions: EngineRuleFuncRunOptions) => Promise>; + userRule: (user: string, ctx: IExampleContext, + runOpts: EngineRuleFuncRunOptions) => + Promise>; } type IExampleRule = Rule; + IExampleFunctionTable, IExampleContextIgnore, IExampleCustomEngineRuleFuncRunOptions>; const context: IExampleContext = { - userId: 'a@b.com', - times: 3, - date: moment(), - nested: { - value: null, - nested2: { - value3: true, + userId: 'a@b.com', + times: 3, + date: moment(), + nested: { + value: null, + nested2: { + value3: true, + }, }, - }, }; // For validation we must provide a full example context const validationContext: ValidationContext = { - userId: 'a@b.com', - times: 3, - date: moment(), - nested: { - value: 5, - nested2: { - value2: 6, - value3: true, + userId: 'a@b.com', + times: 3, + date: moment(), + nested: { + value: 5, + nested2: { + value2: 6, + value3: true, + }, }, - }, }; const functionsTable: IExampleFunctionTable = { - countRange: ([min, max]: [min: number, max: number], ctx: { times: number | undefined }, runOptions: EvaluatorFuncRunOptions): boolean => { - return ctx.times === undefined ? false : ctx.times >= min && ctx.times < max; - }, + countRange: ([min, max]: [min: number, max: number], ctx: { times: number | undefined }, + runOptions: EngineRuleFuncRunOptions): boolean => { + return ctx.times === undefined ? false : ctx.times >= min && ctx.times < max; + }, }; const ruleFunctionsTable: IExampleRuleFunctionTable = { - userRule: async (user: string, ctx: IExampleContext, runOptions: EngineRuleFuncRunOptions): Promise> => { - if (ctx.userId === user) { - return { - message: `Username ${user} is not allowed`, - custom: 543, - } - } - }, + userRule: async (user: string, ctx: IExampleContext, + runOptions: EngineRuleFuncRunOptions) + : Promise> => { + if (ctx.userId === user) { + return { + message: `Username ${user} is not allowed`, + custom: 543, + } + } + }, }; const rules: IExampleRule[] = [ - { - condition: { - or: [ - { - userId: 'a@b.com', + { + condition: { + or: [ + { + userId: 'a@b.com', + }, + { + and: [ + { + countRange: [2, 6], + }, + { + 'nested.nested2.value3': true, + }, + ], + }, + ], }, - { - and: [ - { - countRange: [2, 6], - }, - { - 'nested.nested2.value3': true, - }, - ], + consequence: { + message: ['user', { + ref: 'userId', + }, 'should not equal a@b.com'], + custom: 579, }, - ], }, - consequence: { - message: ['user', { - ref: 'userId', - }, 'should not equal a@b.com'], - custom: 579, + { + userRule: 'b@c.com', }, - }, - { - userRule: 'b@c.com', - }, ]; -// Example usage 1 -const engine = new RulesEngine(functionsTable, ruleFunctionsTable); -await engine.validate(rules, validationContext); // Should not throw -console.log(JSON.stringify(await engine.evaluateAll(rules, context))); // [{"message":"user a@b.com should not equal a@b.com","custom":579}] - -// Example usage 2 -await validateRules(rules, validationContext, functionsTable, ruleFunctionsTable); // Should not throw -console.log(JSON.stringify(await evaluateRules(rules, context, functionsTable, ruleFunctionsTable, false))); // [{"message":"user a@b.com should not equal a@b.com","custom":579}] +(async () => { + // Example usage 1 + const engine = new RulesEngine( + functionsTable, ruleFunctionsTable); + await engine.validate(rules, validationContext, {dryRun: false}); // Should not throw + console.log(JSON.stringify(await engine.evaluateAll(rules, context, {dryRun: false}))); // [{"message":"user a@b.com should not equal a@b.com","custom":579}] + + // Example usage 2 + await validateRules( + rules, validationContext, functionsTable, ruleFunctionsTable, {dryRun: false}); // Should not throw + console.log(JSON.stringify(await evaluateRules(rules, context, functionsTable, ruleFunctionsTable, false, {dryRun: false}))); // [{"message":"user a@b.com should not equal a@b.com","custom":579}] +})(); ``` diff --git a/package.json b/package.json index 5807286..a42effe 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,19 @@ { "name": "json-expression-eval", - "version": "6.0.0", + "version": "7.0.0", "description": "json serializable rule engine / boolean expression evaluator", "main": "dist/index.js", "types": "dist/index.d.ts", "engines": { - "node": "^6 || ^8 || ^10 || ^12 || ^14 || ^16 || ^18" + "node": "^14 || ^16 || ^18 || ^19" }, "scripts": { "test": "yarn lint && yarn test:tsd && yarn test:cover", "test:tsd": "tsd", - "test:unit": "mocha --opts src/test/mocha.opts", + "test:unit": "mocha --config src/test/.mocharc.json", "build": "yarn lint && yarn compile", "compile": "./node_modules/.bin/tsc", - "test:cover": "nyc --reporter=lcov --reporter=text-summary mocha --opts src/test/mocha.opts", + "test:cover": "nyc --reporter=lcov --reporter=text-summary mocha --config src/test/.mocharc.json", "lint": "tslint -c tslint.json 'src/**/*.ts' 'test/**/*.ts'", "ci": "yarn lint && yarn compile && yarn test:tsd && yarn test:cover" }, @@ -48,27 +48,24 @@ "directory": "src/test/types" }, "devDependencies": { - "@istanbuljs/nyc-config-typescript": "0.1.3", - "@types/chai": "^4.2.16", + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@types/chai": "^4.3.4", "@types/chai-as-promised": "^7.1.5", - "@types/mocha": "^8.2.2", - "@types/node": "^14.14.37", - "@types/underscore": "^1.11.1", - "chai": "^4.3.4", + "@types/mocha": "^10.0.1", + "@types/node": "^18.14.2", + "@types/underscore": "^1.11.4", + "chai": "^4.3.7", "chai-as-promised": "^7.1.1", - "mocha": "^6.2.3", - "moment": "^2.29.1", - "nyc": "^14.1.1", + "mocha": "^10.2.0", + "moment": "^2.29.4", + "nyc": "^15.1.0", "source-map-support": "^0.5.21", - "ts-node": "^8.10.2", - "tsd": "^0.21.0", + "ts-node": "^10.9.1", + "tsd": "^0.25.0", "tslint": "^6.1.3", - "typescript": "4.6.4" + "typescript": "^4.9.5" }, "dependencies": { "ts-toolbelt": "^9.6.0" - }, - "resolutions": { - "merge2": "1.3.0" } } diff --git a/src/examples/engine/example.ts b/src/examples/engine/example.ts index cb57d93..c3cc4f8 100644 --- a/src/examples/engine/example.ts +++ b/src/examples/engine/example.ts @@ -14,7 +14,7 @@ const context: ExpressionContext = { }; const run = async (_rules: MyRule[], _context: ExpressionContext) => { - const result = await engine.evaluateAll(_rules, _context); + const result = await engine.evaluateAll(_rules, _context, {dryRun: false}); console.log(`Evaluating rules ${JSON.stringify(_rules)} using context ${JSON.stringify(_context)}`); console.log(`Result: ${JSON.stringify(result)}\n\n`); }; diff --git a/src/examples/engine/lib/engine.ts b/src/examples/engine/lib/engine.ts index 70861a5..e79dc19 100644 --- a/src/examples/engine/lib/engine.ts +++ b/src/examples/engine/lib/engine.ts @@ -18,7 +18,10 @@ export type Ignore = Moment; export type Payload = number; export type ExpressionFunction = typeof functionsTable; export type RuleFunction = typeof ruleFunctionsTable; -export type MyRule = Rule; -export const engine = new RulesEngine +export type CustomEngineRuleFuncRunOptions = {dryRun: boolean}; +export type MyRule = Rule; +export const engine = new RulesEngine (functionsTable, ruleFunctionsTable); diff --git a/src/examples/engine/lib/functions/counterFunc.ts b/src/examples/engine/lib/functions/counterFunc.ts index 09c7b6f..66a85aa 100644 --- a/src/examples/engine/lib/functions/counterFunc.ts +++ b/src/examples/engine/lib/functions/counterFunc.ts @@ -1,3 +1,4 @@ -export const counterFunc = async (maxCount: number, context: { times: number }): Promise => { +export const counterFunc = async (maxCount: number, context: { times: number }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}): Promise => { return context.times < maxCount; }; diff --git a/src/examples/engine/lib/functions/userFunc.ts b/src/examples/engine/lib/functions/userFunc.ts index df88a65..2301c3c 100644 --- a/src/examples/engine/lib/functions/userFunc.ts +++ b/src/examples/engine/lib/functions/userFunc.ts @@ -1,3 +1,4 @@ -export const userFunc = (user: string, context: { userId: string }): boolean => { +export const userFunc = (user: string, context: { userId: string } + , runOpts: {validation: boolean, custom: {dryRun: boolean}}): boolean => { return context.userId === user; }; diff --git a/src/examples/engine/lib/rules/userRule.ts b/src/examples/engine/lib/rules/userRule.ts index 0e934c6..fcec632 100644 --- a/src/examples/engine/lib/rules/userRule.ts +++ b/src/examples/engine/lib/rules/userRule.ts @@ -1,6 +1,7 @@ import {ResolvedConsequence} from '../../../../types'; -export const userRule = async (user: string, context: { userId: string }) +export const userRule = async (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}) : Promise> => { if (context.userId === user) { return { diff --git a/src/examples/evaluator/example.ts b/src/examples/evaluator/example.ts index 9910b45..9d956ea 100644 --- a/src/examples/evaluator/example.ts +++ b/src/examples/evaluator/example.ts @@ -2,6 +2,7 @@ import {ExpressionContext, ExpressionFunction, getEvaluator} from './lib/evaluat import {Expression, ExpressionParts} from '../..'; import {Moment} from 'moment'; import moment = require('moment'); +import {CustomEvaluatorFuncRunOptions} from './lib/evaluator'; const context: ExpressionContext = { userId: 'a@b.com', @@ -15,13 +16,14 @@ const context: ExpressionContext = { }, }; -const run = async (expr: Expression, ctx: ExpressionContext) => { - const result = await getEvaluator(expression).evaluate(ctx); +const run = async (expr: Expression, + ctx: ExpressionContext) => { + const result = await getEvaluator(expression).evaluate(ctx, {dryRun: true}); console.log(`Evaluating expression ${JSON.stringify(expr)} using context ${JSON.stringify(ctx)}`); console.log(`Result: ${result}`); }; -let expression: Expression = { +let expression: Expression = { user: 'a@b.com', }; @@ -121,7 +123,8 @@ expression = { run(expression, context); -const expressionParts: ExpressionParts = { +const expressionParts: ExpressionParts = { 'nested.value': { isArray: false, isFunction: false, diff --git a/src/examples/evaluator/lib/evaluator.ts b/src/examples/evaluator/lib/evaluator.ts index 635b7fa..ae99bb3 100644 --- a/src/examples/evaluator/lib/evaluator.ts +++ b/src/examples/evaluator/lib/evaluator.ts @@ -16,6 +16,10 @@ export interface ExpressionContext { export type ExpressionFunction = typeof functionsTable; -export const getEvaluator = (expression: Expression) => - new ExpressionHandler(expression, functionsTable); +export type CustomEvaluatorFuncRunOptions = {dryRun: boolean}; + +export const getEvaluator = (expression: Expression) => + new ExpressionHandler + (expression, functionsTable); diff --git a/src/examples/evaluator/lib/functions/counterFunc.ts b/src/examples/evaluator/lib/functions/counterFunc.ts index fb089f3..172aa60 100644 --- a/src/examples/evaluator/lib/functions/counterFunc.ts +++ b/src/examples/evaluator/lib/functions/counterFunc.ts @@ -1,3 +1,4 @@ -export const counterFunc = (maxCount: number, context: { times: number }): boolean => { +export const counterFunc = (maxCount: number, context: { times: number }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}): boolean => { return context.times < maxCount; }; diff --git a/src/examples/evaluator/lib/functions/userFunc.ts b/src/examples/evaluator/lib/functions/userFunc.ts index d59cc15..2f90696 100644 --- a/src/examples/evaluator/lib/functions/userFunc.ts +++ b/src/examples/evaluator/lib/functions/userFunc.ts @@ -1,3 +1,4 @@ -export const userFunc = async (user: string, context: { userId: string }): Promise => { +export const userFunc = async (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}): Promise => { return context.userId === user; }; diff --git a/src/lib/engine.ts b/src/lib/engine.ts index bf8025f..fdeea4d 100644 --- a/src/lib/engine.ts +++ b/src/lib/engine.ts @@ -5,27 +5,39 @@ import {isRuleFunction} from './typeGuards'; import {evaluateEngineConsequence} from './engineConsequenceEvaluator'; async function run, F extends FunctionsTable, Ignore = never> -(rules: Rule[], context: C, functionsTable: F, ruleFunctionsTable: RF, - haltOnFirstMatch: boolean, validation: false) + RF extends RuleFunctionsTable, + F extends FunctionsTable, + Ignore, CustomEngineRuleFuncRunOptions>(rules: Rule[], + context: C, functionsTable: F, ruleFunctionsTable: RF, + haltOnFirstMatch: boolean, validation: false, runOptions: CustomEngineRuleFuncRunOptions) : Promise[]> async function run, F extends FunctionsTable, Ignore = never> -(rules: Rule[], context: ValidationContext, + RF extends RuleFunctionsTable, + F extends FunctionsTable, Ignore, + CustomEngineRuleFuncRunOptions>(rules: Rule[], context: ValidationContext, functionsTable: F, ruleFunctionsTable: RF, - haltOnFirstMatch: boolean, validation: true) + haltOnFirstMatch: boolean, validation: true, runOptions: CustomEngineRuleFuncRunOptions) : Promise[]> async function run, F extends FunctionsTable, Ignore = never> -(rules: Rule[], context: C | ValidationContext, functionsTable: F, - ruleFunctionsTable: RF, haltOnFirstMatch: boolean, validation: boolean) + RF extends RuleFunctionsTable, + F extends FunctionsTable, + Ignore, CustomEngineRuleFuncRunOptions>(rules: Rule[], + context: C | ValidationContext, functionsTable: F, + ruleFunctionsTable: RF, haltOnFirstMatch: boolean, validation: boolean, runOptions: CustomEngineRuleFuncRunOptions) : Promise[]> { const errors: ResolvedConsequence[] = []; for (const rule of rules) { const keys = objectKeys(rule); const key = keys[0]; - if (keys.length === 1 && key && isRuleFunction(rule, ruleFunctionsTable, key)) { - const consequence = await ruleFunctionsTable[key](rule[key], context as C, {validation}); + if (keys.length === 1 && key && isRuleFunction( + rule, ruleFunctionsTable, key)) { + const consequence = await ruleFunctionsTable[key](rule[key], context as C, { + custom: runOptions, + validation, + }); if (consequence) { errors.push(consequence); if (haltOnFirstMatch && !validation) { @@ -40,10 +52,12 @@ async function run(rule.condition, context as ValidationContext, functionsTable); + await validate(rule.condition, + context as ValidationContext, functionsTable, runOptions); await evaluateEngineConsequence(context as C, rule.consequence); } else { - const ruleApplies = await evaluate(rule.condition, context as C, functionsTable); + const ruleApplies = await evaluate( + rule.condition, context as C, functionsTable, runOptions); if (ruleApplies) { const consequence = await evaluateEngineConsequence(context as C, rule.consequence); @@ -59,19 +73,25 @@ async function run, F extends FunctionsTable, Ignore = never> -(rules: Rule[], context: C, functionsTable: F, ruleFunctionsTable: RF, - haltOnFirstMatch: boolean) + RF extends RuleFunctionsTable, + F extends FunctionsTable, + Ignore = never, CustomEngineRuleFuncRunOptions = {}>(rules: Rule[], context: C, functionsTable: F, ruleFunctionsTable: RF, + haltOnFirstMatch: boolean, runOptions: CustomEngineRuleFuncRunOptions) : Promise[]> => { - return run( - rules, context, functionsTable, ruleFunctionsTable, haltOnFirstMatch, false); + return run( + rules, context, functionsTable, ruleFunctionsTable, haltOnFirstMatch, false, runOptions); } export const validateRules = async , F extends FunctionsTable, Ignore = never> -(rules: Rule[], validationContext: ValidationContext, - functionsTable: F, ruleFunctionsTable: RF) + RF extends RuleFunctionsTable, + F extends FunctionsTable, + Ignore = never, CustomEngineRuleFuncRunOptions = {}>( + rules: Rule[], + validationContext: ValidationContext, + functionsTable: F, ruleFunctionsTable: RF, runOptions: CustomEngineRuleFuncRunOptions) : Promise => { - await run(rules, validationContext, functionsTable, - ruleFunctionsTable, false, true); + await run( + rules, validationContext, functionsTable, + ruleFunctionsTable, false, true, runOptions); } diff --git a/src/lib/evaluator.ts b/src/lib/evaluator.ts index 65dcd56..0da75fb 100644 --- a/src/lib/evaluator.ts +++ b/src/lib/evaluator.ts @@ -147,13 +147,16 @@ async function evaluateCompareOp(expressionValue: Ext } } -async function handleAndOp, Ignore> -(andExpression: Expression[], context: C, functionsTable: F, validation: boolean): Promise { +async function handleAndOp, + Ignore, CustomEvaluatorFuncRunOptions> +(andExpression: Expression[], context: C, functionsTable: F, + validation: boolean, runOptions: CustomEvaluatorFuncRunOptions): Promise { if (andExpression.length === 0) { throw new Error('Invalid expression - and operator must have at least one expression'); } for (const currExpression of andExpression) { - const result = await run(currExpression, context, functionsTable, validation); + const result = await run(currExpression, + context, functionsTable, validation, runOptions); if (!validation && !result) { return false; } @@ -161,13 +164,17 @@ async function handleAndOp, Ignor return true; } -async function handleOrOp, Ignore> -(orExpression: Expression[], context: C, functionsTable: F, validation: boolean): Promise { +async function handleOrOp, + Ignore, CustomEvaluatorFuncRunOptions>( + orExpression: Expression[], + context: C, functionsTable: F, validation: boolean, runOptions: CustomEvaluatorFuncRunOptions) + : Promise { if (orExpression.length === 0) { throw new Error('Invalid expression - or operator must have at least one expression'); } for (const currExpression of orExpression) { - const result = await run(currExpression, context, functionsTable, validation); + const result = await run( + currExpression, context, functionsTable, validation, runOptions); if (!validation && result) { return true; } @@ -175,21 +182,30 @@ async function handleOrOp, Ignore return false; } -async function run, Ignore> -(expression: Expression, context: C, functionsTable: F, validation: boolean): Promise { +async function run, + Ignore, CustomEvaluatorFuncRunOptions>( + expression: Expression, context: C, + functionsTable: F, validation: boolean, runOptions: CustomEvaluatorFuncRunOptions): Promise { const expressionKeys = objectKeys(expression); if (expressionKeys.length !== 1) { throw new Error('Invalid expression - too may keys'); } const expressionKey = expressionKeys[0]; - if (isAndCompareOp(expression)) { - return handleAndOp(expression.and, context, functionsTable, validation); - } else if (isOrCompareOp(expression)) { - return handleOrOp(expression.or, context, functionsTable, validation); - } else if (isNotCompareOp(expression)) { - return !(await run(expression.not, context, functionsTable, validation)); - } else if (isFunctionCompareOp(expression, functionsTable, expressionKey)) { - return functionsTable[expressionKey](expression[expressionKey], context, {validation}); + if (isAndCompareOp(expression)) { + return handleAndOp(expression.and, + context, functionsTable, validation, runOptions); + } else if (isOrCompareOp(expression)) { + return handleOrOp(expression.or, context, + functionsTable, validation, runOptions); + } else if (isNotCompareOp(expression)) { + return !(await run(expression.not, context, + functionsTable, validation, runOptions)); + } else if (isFunctionCompareOp(expression, + functionsTable, expressionKey)) { + return functionsTable[expressionKey](expression[expressionKey], context, { + custom: runOptions, + validation, + }); } else { const {value: contextValue, exists} = getFromPath(context, expressionKey); if (validation && !exists) { @@ -203,14 +219,21 @@ async function run, Ignore> } } -export const evaluate = async , Ignore = never> -(expression: Expression, context: C, functionsTable: F): Promise => { - return run(expression, context, functionsTable, false); +export const evaluate = async , + Ignore = never, CustomEvaluatorFuncRunOptions = {}>( + expression: Expression, context: C, functionsTable: F + , runOptions: CustomEvaluatorFuncRunOptions) + : Promise => { + return run(expression, context, + functionsTable, false, runOptions); }; // Throws in case of validation error. Does not run functions or compare fields -export const validate = async , Ignore = never> -(expression: Expression, validationContext: ValidationContext, functionsTable: F) +export const validate = async , + Ignore = never, CustomEvaluatorFuncRunOptions = {}>( + expression: Expression, + validationContext: ValidationContext, functionsTable: F, runOptions: CustomEvaluatorFuncRunOptions) : Promise => { - await run(expression, validationContext as C, functionsTable, true); + await run(expression, + validationContext as C, functionsTable, true, runOptions); }; diff --git a/src/lib/expressionHandler.ts b/src/lib/expressionHandler.ts index 5621bac..6725c18 100644 --- a/src/lib/expressionHandler.ts +++ b/src/lib/expressionHandler.ts @@ -6,17 +6,22 @@ import { ValidationContext } from '../types'; -export class ExpressionHandler, Ignore = never> { +export class ExpressionHandler, + Ignore = never, CustomEvaluatorFuncRunOptions = {}> { - constructor(private readonly expression: Expression, private readonly functionsTable: F) { + constructor(private readonly expression: Expression, + private readonly functionsTable: F) { } - public async evaluate(context: C): Promise { - return evaluate(this.expression, context, this.functionsTable); + public async evaluate(context: C, runOptions: CustomEvaluatorFuncRunOptions): Promise { + return evaluate( + this.expression, context, this.functionsTable, runOptions); } - public async validate(validationContext: ValidationContext): Promise { - await validate(this.expression, validationContext, this.functionsTable); + public async validate(validationContext: ValidationContext, runOptions: CustomEvaluatorFuncRunOptions) + : Promise { + await validate( + this.expression, validationContext, this.functionsTable, runOptions); } } diff --git a/src/lib/rulesEngine.ts b/src/lib/rulesEngine.ts index 01b14f4..709a82b 100644 --- a/src/lib/rulesEngine.ts +++ b/src/lib/rulesEngine.ts @@ -6,27 +6,35 @@ import { import {evaluateRules, validateRules} from './engine'; export class RulesEngine, F extends FunctionsTable, Ignore = never> { + RF extends RuleFunctionsTable, + F extends FunctionsTable, + Ignore = never, CustomEngineRuleFuncRunOptions = {}> { constructor(private readonly functionsTable: F, private readonly ruleFunctionsTable: RF) { } - public async evaluate(rules: Rule[], context: C) + public async evaluate(rules: Rule[], context: C, runOptions: CustomEngineRuleFuncRunOptions) : Promise> { - return (await evaluateRules(rules, context, - this.functionsTable, this.ruleFunctionsTable, true))?.[0]; + return (await evaluateRules( + rules, context, + this.functionsTable, this.ruleFunctionsTable, true, runOptions))?.[0]; } - public async evaluateAll(rules: Rule[], context: C) + public async evaluateAll(rules: Rule[], + context: C, runOptions: CustomEngineRuleFuncRunOptions) : Promise[]> { - return evaluateRules(rules, context, - this.functionsTable, this.ruleFunctionsTable, false); + return evaluateRules( + rules, context, + this.functionsTable, this.ruleFunctionsTable, false, runOptions); } - public async validate(rules: Rule[], - validationContext: ValidationContext): Promise { - await validateRules(rules, validationContext, - this.functionsTable, this.ruleFunctionsTable); + public async validate(rules: Rule[], + validationContext: ValidationContext, runOptions: CustomEngineRuleFuncRunOptions) + : Promise { + await validateRules( + rules, validationContext, + this.functionsTable, this.ruleFunctionsTable, runOptions); } } diff --git a/src/lib/typeGuards.ts b/src/lib/typeGuards.ts index 3e87eb9..12d1498 100644 --- a/src/lib/typeGuards.ts +++ b/src/lib/typeGuards.ts @@ -12,7 +12,7 @@ import { RegexiCompareOp, NotCompareOp, NotEqualCompareOp, - OrCompareOp, InqCompareOp, NinCompareOp, RuleFunctionsTable, RuleFunctionsParams, Primitive, MathOp + OrCompareOp, InqCompareOp, NinCompareOp, RuleFunctionsTable, RuleFunctionsParams, MathOp } from '../types'; export const _isObject = (obj: unknown): boolean => { @@ -21,32 +21,38 @@ export const _isObject = (obj: unknown): boolean => { }; export const isFunctionCompareOp = - , Ignore>(expression: unknown, functionsTable: F, key: string): - expression is FuncCompares => { + , + Ignore, CustomEvaluatorFuncRunOptions>(expression: unknown, functionsTable: F, key: string): + expression is FuncCompares => { return key in functionsTable; } export const isRuleFunction = - >( + , + CustomEngineRuleFuncRunOptions>( expression: unknown, ruleFunctionsTable: RF, key: string): - expression is RuleFunctionsParams => { + expression is RuleFunctionsParams => { return key in ruleFunctionsTable; } export const isAndCompareOp = - , Ignore>(expression: unknown): - expression is AndCompareOp => { - return Array.isArray((expression as AndCompareOp).and); + , + Ignore, CustomEvaluatorFuncRunOptions>(expression: unknown): + expression is AndCompareOp => { + return Array.isArray((expression as AndCompareOp).and); } -export const isOrCompareOp = , Ignore>(expression: unknown): - expression is OrCompareOp => { - return Array.isArray((expression as OrCompareOp).or); +export const isOrCompareOp = , + Ignore, CustomEvaluatorFuncRunOptions>(expression: unknown): + expression is OrCompareOp => { + return Array.isArray((expression as OrCompareOp).or); } -export const isNotCompareOp = , Ignore>(expression: unknown): - expression is NotCompareOp => { - return _isObject((expression as NotCompareOp).not); +export const isNotCompareOp = , + Ignore, CustomEvaluatorFuncRunOptions>(expression: unknown): + expression is NotCompareOp => { + return _isObject((expression as NotCompareOp).not); } export const isBetweenCompareOp = (op: ExtendedCompareOp) diff --git a/src/test/.mocharc.json b/src/test/.mocharc.json new file mode 100644 index 0000000..0f3c843 --- /dev/null +++ b/src/test/.mocharc.json @@ -0,0 +1,9 @@ +{ + "reporter": "spec", + "require": [ + "ts-node/register", + "source-map-support/register" + ], + "recursive": true, + "spec": "src/test/**/*.spec.ts" +} diff --git a/src/test/engine.spec.ts b/src/test/engine.spec.ts index 0a36a60..e9a956a 100644 --- a/src/test/engine.spec.ts +++ b/src/test/engine.spec.ts @@ -6,13 +6,22 @@ import * as chaiAsPromised from 'chai-as-promised'; chai.use(chaiAsPromised); const functionsTable = { - user: (user: string, context: { userId: string }): boolean => { + user: (user: string, context: { userId: string }, runOpts: {validation: boolean; custom: {dryRun: boolean}}) + : boolean => { return context.userId === user; }, + userComplex: async (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}): Promise => { + if (runOpts.validation && !runOpts.custom.dryRun) { + throw new Error(`Failed user validation`); + } + return runOpts.validation || runOpts.custom.dryRun ? true : context.userId === user; + }, }; const ruleFunctionsTable = { - userRule: async (user: string, context: { userId: string }): Promise => { @@ -23,10 +32,27 @@ const ruleFunctionsTable = { } } }, + userRuleComplex: async (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}): Promise => { + if (runOpts.validation && !runOpts.custom.dryRun) { + throw new Error(`Failed user validation`); + } + if (runOpts.validation || runOpts.custom.dryRun || context.userId === user) { + return { + message: `Username ${user} is not allowed`, + custom: 543, + } + } + }, }; type ExpressionFunction = typeof functionsTable; type RuleFunction = typeof ruleFunctionsTable; +type Ignore = never; +type CustomEngineRuleFuncRunOptions = {dryRun: boolean}; describe('engine', () => { @@ -39,7 +65,7 @@ describe('engine', () => { value: number | null, }, } - const rules: Rule[] = [ + const rules: Rule[] = [ // @ts-ignore { consequence: { @@ -63,19 +89,24 @@ describe('engine', () => { value: 7, }, }; - const engine = new RulesEngine + const runOpts: CustomEngineRuleFuncRunOptions = {dryRun: false}; + const engine = new RulesEngine (functionsTable, ruleFunctionsTable); - await expect(engine.validate(rules, validationContext)) + await expect(engine.validate(rules, validationContext, runOpts)) .to.eventually.rejectedWith(Error, 'Missing condition for rule'); - await expect(validateRules(rules, validationContext, - functionsTable, ruleFunctionsTable)) + await expect(validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Missing condition for rule'); - await expect(evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, true)).to.eventually.rejectedWith(Error, 'Missing condition for rule'); - await expect(evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, false)).to.eventually.rejectedWith(Error, 'Missing condition for rule'); - await expect(engine.evaluate(rules, context)).to.eventually.rejectedWith(Error, 'Missing condition for rule'); - await expect(engine.evaluateAll(rules, context)).to.eventually + await expect(evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, true, runOpts)).to.eventually.rejectedWith(Error, 'Missing condition for rule'); + await expect(evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, false, runOpts)).to.eventually.rejectedWith(Error, 'Missing condition for rule'); + await expect(engine.evaluate(rules, context, runOpts)).to.eventually.rejectedWith(Error, 'Missing condition for rule'); + await expect(engine.evaluateAll(rules, context, runOpts)).to.eventually .rejectedWith(Error, 'Missing condition for rule'); }); @@ -88,7 +119,7 @@ describe('engine', () => { value: number | null, }, } - const rules: Rule[] = [ + const rules: Rule[] = [ // @ts-ignore { condition: { @@ -111,19 +142,24 @@ describe('engine', () => { value: 7, }, }; - const engine = new RulesEngine + const runOpts: CustomEngineRuleFuncRunOptions = {dryRun: false}; + const engine = new RulesEngine (functionsTable, ruleFunctionsTable); - await expect(engine.validate(rules, validationContext)) + await expect(engine.validate(rules, validationContext, runOpts)) .to.eventually.rejectedWith(Error, 'Missing consequence for rule'); - await expect(validateRules(rules, validationContext, - functionsTable, ruleFunctionsTable)) + await expect(validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Missing consequence for rule'); - await expect(evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, true)).to.eventually.rejectedWith(Error, 'Missing consequence for rule'); - await expect(evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, false)).to.eventually.rejectedWith(Error, 'Missing consequence for rule'); - await expect(engine.evaluate(rules, context)).to.eventually.rejectedWith(Error, 'Missing consequence for rule'); - await expect(engine.evaluateAll(rules, context)).to + await expect(evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, true, runOpts)).to.eventually.rejectedWith(Error, 'Missing consequence for rule'); + await expect(evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, false, runOpts)).to.eventually.rejectedWith(Error, 'Missing consequence for rule'); + await expect(engine.evaluate(rules, context, runOpts)).to.eventually.rejectedWith(Error, 'Missing consequence for rule'); + await expect(engine.evaluateAll(rules, context, runOpts)).to .eventually.rejectedWith(Error, 'Missing consequence for rule'); }); @@ -136,7 +172,7 @@ describe('engine', () => { value: number | null, }, } - const rules: Rule[] = [ + const rules: Rule[] = [ { condition: { // @ts-ignore @@ -156,12 +192,15 @@ describe('engine', () => { value: 7, }, }; - const engine = new RulesEngine + const runOpts: CustomEngineRuleFuncRunOptions = {dryRun: false}; + const engine = new RulesEngine (functionsTable, ruleFunctionsTable); - await expect(engine.validate(rules, validationContext)) + await expect(engine.validate(rules, validationContext, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - unknown context key userIds'); - await expect(validateRules(rules, validationContext, - functionsTable, ruleFunctionsTable)) + await expect(validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - unknown context key userIds'); }); @@ -174,7 +213,7 @@ describe('engine', () => { value: number | null, }, } - const rules: Rule[] = [ + const rules: Rule[] = [ { condition: { 'userId': 'a', @@ -203,22 +242,175 @@ describe('engine', () => { value: 7, }, }; - const engine = new RulesEngine + const runOpts: CustomEngineRuleFuncRunOptions = {dryRun: false}; + const engine = new RulesEngine (functionsTable, ruleFunctionsTable); - await expect(engine.validate(rules, validationContext)) + await expect(engine.validate(rules, validationContext, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid consequence ref - unknown context key userIdd'); - await expect(validateRules(rules, validationContext, - functionsTable, ruleFunctionsTable)) + await expect(validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid consequence ref - unknown context key userIdd'); - await expect(evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, true)).to.eventually.rejectedWith(Error, 'Invalid consequence ref - unknown context key userIdd'); - await expect(evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, false)).to.eventually.rejectedWith(Error, 'Invalid consequence ref - unknown context key userIdd'); - await expect(engine.evaluate(rules, context)).to.eventually.rejectedWith(Error, 'Invalid consequence ref - unknown context key userIdd'); - await expect(engine.evaluateAll(rules, context)).to + await expect(evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, true, runOpts)).to.eventually.rejectedWith(Error, 'Invalid consequence ref - unknown context key userIdd'); + await expect(evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, false, runOpts)).to.eventually.rejectedWith(Error, 'Invalid consequence ref - unknown context key userIdd'); + await expect(engine.evaluate(rules, context, runOpts)).to.eventually.rejectedWith(Error, 'Invalid consequence ref - unknown context key userIdd'); + await expect(engine.evaluateAll(rules, context, runOpts)).to .eventually.rejectedWith(Error, 'Invalid consequence ref - unknown context key userIdd'); }); + it('should pass run opts to functions', async () => { + type Con = { + userId: string, + } + const rules: Rule[] = [ + { + condition: { + userComplex: 'b', + }, + consequence: { + message: ['user', {ref: 'userId'}, 'should not equal b'], + custom: 579, + }, + }, + ]; + const validationContext: ValidationContext = { + userId: 'a', + }; + const engine = new RulesEngine + (functionsTable, ruleFunctionsTable); + await expect(engine.validate(rules, validationContext, {dryRun: false})) + .to.eventually.rejectedWith(Error, 'Failed user validation'); + expect(await engine.validate(rules, validationContext, {dryRun: true})).to.be.an('undefined'); + await expect(validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, {dryRun: false})) + .to.eventually.rejectedWith(Error, 'Failed user validation'); + expect(await validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, {dryRun: true})).to.be.an('undefined'); + expect(await evaluateRules(rules, { + userId: 'b', + }, functionsTable + , ruleFunctionsTable, true, {dryRun: false})).to.eql([ + { + 'custom': 579, + 'message': 'user b should not equal b', + }, + ]); + expect(await engine.evaluate(rules, { + userId: 'b', + }, {dryRun: false})).to.eql( + { + 'custom': 579, + 'message': 'user b should not equal b', + } + ); + expect(await evaluateRules(rules, { + userId: 'a', + }, functionsTable + , ruleFunctionsTable, true, {dryRun: false})).to.eql(undefined); + expect(await engine.evaluate(rules, { + userId: 'a', + }, {dryRun: false})).to.eql(undefined); + expect(await evaluateRules(rules, { + userId: 'a', + }, functionsTable + , ruleFunctionsTable, true, {dryRun: true})).to.eql([ + { + 'custom': 579, + 'message': 'user a should not equal b', + }, + ]); + expect(await engine.evaluate(rules, { + userId: 'a', + }, {dryRun: true})).to.eql( + { + 'custom': 579, + 'message': 'user a should not equal b', + } + ); + }); + + it('should pass run opts to rules', async () => { + type Con = { + userId: string, + } + const rules: Rule[] = [ + { + userRuleComplex: 'b', + }, + ]; + const validationContext: ValidationContext = { + userId: 'a', + }; + const engine = new RulesEngine + (functionsTable, ruleFunctionsTable); + await expect(engine.validate(rules, validationContext, {dryRun: false})) + .to.eventually.rejectedWith(Error, 'Failed user validation'); + expect(await engine.validate(rules, validationContext, {dryRun: true})).to.be.an('undefined'); + await expect(validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, {dryRun: false})) + .to.eventually.rejectedWith(Error, 'Failed user validation'); + expect(await validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, {dryRun: true})).to.be.an('undefined'); + expect(await evaluateRules(rules, { + userId: 'b', + }, functionsTable + , ruleFunctionsTable, true, {dryRun: false})).to.eql([ + { + 'custom': 543, + 'message': 'Username b is not allowed', + }, + ]); + expect(await engine.evaluate(rules, { + userId: 'b', + }, {dryRun: false})).to.eql( + { + 'custom': 543, + 'message': 'Username b is not allowed', + } + ); + expect(await evaluateRules(rules, { + userId: 'a', + }, functionsTable + , ruleFunctionsTable, true, {dryRun: false})).to.eql(undefined); + expect(await engine.evaluate(rules, { + userId: 'a', + }, {dryRun: false})).to.eql(undefined); + expect(await evaluateRules(rules, { + userId: 'a', + }, functionsTable + , ruleFunctionsTable, true, {dryRun: true})).to.eql([ + { + 'custom': 543, + 'message': 'Username b is not allowed', + }, + ]); + expect(await engine.evaluate(rules, { + userId: 'a', + }, {dryRun: true})).to.eql( + { + 'custom': 543, + 'message': 'Username b is not allowed', + } + ); + }); + it('should evaluate and pass properly', async () => { type Con = { timesCounter?: number; @@ -228,7 +420,7 @@ describe('engine', () => { value: number | null, }, } - const rules: Rule[] = [ + const rules: Rule[] = [ { condition: { user: 'b', @@ -266,17 +458,22 @@ describe('engine', () => { value: 7, }, }; - const engine = new RulesEngine + const runOpts: CustomEngineRuleFuncRunOptions = {dryRun: false}; + const engine = new RulesEngine (functionsTable, ruleFunctionsTable); - expect(await engine.validate(rules, validationContext)).to.be.an('undefined'); - expect(await validateRules(rules, validationContext, - functionsTable, ruleFunctionsTable)).to.be.an('undefined'); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, true)).to.eql(undefined); - expect(await engine.evaluate(rules, context)).to.eql(undefined); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, false)).to.eql(undefined); - expect(await engine.evaluateAll(rules, context)).to.eql(undefined); + expect(await engine.validate(rules, validationContext, runOpts)).to.be.an('undefined'); + expect(await validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, true, runOpts)).to.eql(undefined); + expect(await engine.evaluate(rules, context, runOpts)).to.eql(undefined); + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, false, runOpts)).to.eql(undefined); + expect(await engine.evaluateAll(rules, context, runOpts)).to.eql(undefined); }); it('should evaluate and fail properly on regular rule', async () => { @@ -288,7 +485,7 @@ describe('engine', () => { value: number | null, }, } - const rules: Rule[] = [ + const rules: Rule[] = [ { condition: { user: 'b', @@ -326,26 +523,31 @@ describe('engine', () => { value: 7, }, }; - const engine = new RulesEngine + const runOpts: CustomEngineRuleFuncRunOptions = {dryRun: false}; + const engine = new RulesEngine (functionsTable, ruleFunctionsTable); - expect(await engine.validate(rules, validationContext)).to.be.an('undefined'); - expect(await validateRules(rules, validationContext, - functionsTable, ruleFunctionsTable)).to.be.an('undefined'); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, true)).to.eql([{ + expect(await engine.validate(rules, validationContext, runOpts)).to.be.an('undefined'); + expect(await validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, true, runOpts)).to.eql([{ 'custom': 578, 'message': 'nested value 7 should not equal 7 days', }]); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, false)).to.eql([{ + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, false, runOpts)).to.eql([{ 'custom': 578, 'message': 'nested value 7 should not equal 7 days', }]); - expect(await engine.evaluate(rules, context)).to.eql({ + expect(await engine.evaluate(rules, context, runOpts)).to.eql({ 'custom': 578, 'message': 'nested value 7 should not equal 7 days', }); - expect(await engine.evaluateAll(rules, context)).to.eql([{ + expect(await engine.evaluateAll(rules, context, runOpts)).to.eql([{ 'custom': 578, 'message': 'nested value 7 should not equal 7 days', }]); @@ -360,7 +562,7 @@ describe('engine', () => { value: number | null, }, } - const rules: Rule[] = [ + const rules: Rule[] = [ { condition: { user: 'b', @@ -398,26 +600,31 @@ describe('engine', () => { value: 7, }, }; - const engine = new RulesEngine + const runOpts: CustomEngineRuleFuncRunOptions = {dryRun: false}; + const engine = new RulesEngine (functionsTable, ruleFunctionsTable); - expect(await engine.validate(rules, validationContext)).to.be.an('undefined'); - expect(await validateRules(rules, validationContext, - functionsTable, ruleFunctionsTable)).to.be.an('undefined'); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, true)).to.eql([{ + expect(await engine.validate(rules, validationContext, runOpts)).to.be.an('undefined'); + expect(await validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, true, runOpts)).to.eql([{ 'custom': 543, 'message': 'Username a is not allowed', }]); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, false)).to.eql([{ + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, false, runOpts)).to.eql([{ 'custom': 543, 'message': 'Username a is not allowed', }]); - expect(await engine.evaluate(rules, context)).to.eql({ + expect(await engine.evaluate(rules, context, runOpts)).to.eql({ 'custom': 543, 'message': 'Username a is not allowed', }); - expect(await engine.evaluateAll(rules, context)).to.eql([{ + expect(await engine.evaluateAll(rules, context, runOpts)).to.eql([{ 'custom': 543, 'message': 'Username a is not allowed', }]); @@ -432,7 +639,7 @@ describe('engine', () => { value: number | null, }, } - const rules: Rule[] = [ + const rules: Rule[] = [ { condition: { user: 'a', @@ -470,26 +677,31 @@ describe('engine', () => { value: 7, }, }; - const engine = new RulesEngine + const runOpts: CustomEngineRuleFuncRunOptions = {dryRun: false}; + const engine = new RulesEngine (functionsTable, ruleFunctionsTable); - expect(await engine.validate(rules, validationContext)).to.be.an('undefined'); - expect(await validateRules(rules, validationContext, - functionsTable, ruleFunctionsTable)).to.be.an('undefined'); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, true)).to.eql([{ + expect(await engine.validate(rules, validationContext, runOpts)).to.be.an('undefined'); + expect(await validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, true, runOpts)).to.eql([{ 'custom': 579, 'message': 'user a should not equal a', }]); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, false)).to.eql([{ + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, false, runOpts)).to.eql([{ 'custom': 579, 'message': 'user a should not equal a', }]); - expect(await engine.evaluate(rules, context)).to.eql({ + expect(await engine.evaluate(rules, context, runOpts)).to.eql({ 'custom': 579, 'message': 'user a should not equal a', }); - expect(await engine.evaluateAll(rules, context)).to.eql([{ + expect(await engine.evaluateAll(rules, context, runOpts)).to.eql([{ 'custom': 579, 'message': 'user a should not equal a', }]); @@ -504,7 +716,7 @@ describe('engine', () => { value: number | null, }, } - const rules: Rule[] = [ + const rules: Rule[] = [ { condition: { user: 'a', @@ -542,18 +754,23 @@ describe('engine', () => { value: 7, }, }; - const engine = new RulesEngine + const runOpts: CustomEngineRuleFuncRunOptions = {dryRun: false}; + const engine = new RulesEngine (functionsTable, ruleFunctionsTable); - expect(await engine.validate(rules, validationContext)).to.be.an('undefined'); - expect(await validateRules(rules, validationContext, - functionsTable, ruleFunctionsTable)).to.be.an('undefined'); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, true)).to.eql([{ + expect(await engine.validate(rules, validationContext, runOpts)).to.be.an('undefined'); + expect(await validateRules(rules, validationContext, + functionsTable, ruleFunctionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, true, runOpts)).to.eql([{ 'custom': 579, 'message': 'user should not equal a', }]); - expect(await evaluateRules(rules, context, functionsTable - , ruleFunctionsTable, false)).to.eql([ + expect(await evaluateRules(rules, context, functionsTable + , ruleFunctionsTable, false, runOpts)).to.eql([ { 'custom': 579, 'message': 'user should not equal a', @@ -563,11 +780,11 @@ describe('engine', () => { 'message': 'Username a is not allowed', }, ]); - expect(await engine.evaluate(rules, context)).to.eql({ + expect(await engine.evaluate(rules, context, runOpts)).to.eql({ 'custom': 579, 'message': 'user should not equal a', }); - expect(await engine.evaluateAll(rules, context)).to.eql([ + expect(await engine.evaluateAll(rules, context, runOpts)).to.eql([ { 'custom': 579, 'message': 'user should not equal a', diff --git a/src/test/evaluator.spec.ts b/src/test/evaluator.spec.ts index 47b1693..1f064c5 100644 --- a/src/test/evaluator.spec.ts +++ b/src/test/evaluator.spec.ts @@ -6,12 +6,23 @@ import * as chaiAsPromised from 'chai-as-promised'; chai.use(chaiAsPromised); const functionsTable = { - user: async (user: string, context: { userId: string }): Promise => { + user: async (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}): Promise => { return context.userId === user; }, + userComplex: async (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}): Promise => { + if (runOpts.validation && !runOpts.custom.dryRun) { + throw new Error(`Failed user validation`); + } + return runOpts.validation || runOpts.custom.dryRun ? true : context.userId === user; + }, }; type ExpressionFunction = typeof functionsTable; +type Ignore = never; +type CustomEvaluatorFuncRunOptions = {dryRun: boolean}; + describe('evaluator', () => { describe(`eq`, () => { @@ -42,11 +53,14 @@ describe('evaluator', () => { value: 7, }, }; - const exp = new ExpressionHandler(expression, functionsTable); - expect(await exp.validate(validationContext)).to.be.an('undefined'); - expect(await validate(expression, validationContext, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); - expect(await exp.evaluate(context)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + const exp = new ExpressionHandler( + expression, functionsTable); + expect(await exp.validate(validationContext, runOpts)).to.be.an('undefined'); + expect(await validate( + expression, validationContext, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); + expect(await exp.evaluate(context, runOpts)).to.eql(true); }); it('should evaluate short eq compare op true to on deeply nested properties', async () => { @@ -70,8 +84,9 @@ describe('evaluator', () => { }, }, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate short eq compare op to true', async () => { @@ -82,8 +97,9 @@ describe('evaluator', () => { timesCounter: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate short eq compare op to false', async () => { @@ -94,8 +110,9 @@ describe('evaluator', () => { timesCounter: 7, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate eq compare op to true', async () => { @@ -106,8 +123,9 @@ describe('evaluator', () => { timesCounter: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref eq compare op to true', async () => { @@ -119,8 +137,9 @@ describe('evaluator', () => { timesCounterToCompare: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate math ref eq compare op to true', async () => { @@ -132,8 +151,9 @@ describe('evaluator', () => { timesCounterToCompare: 4, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate eq compare op to true on nested properties', async () => { @@ -149,8 +169,9 @@ describe('evaluator', () => { value: 7, }, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref eq compare op to true on nested properties', async () => { @@ -171,8 +192,9 @@ describe('evaluator', () => { value2: 7, }, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate eq compare op true to on deeply nested properties', async () => { @@ -200,8 +222,9 @@ describe('evaluator', () => { }, }, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate eq compare ref op true to on deeply nested properties', async () => { @@ -235,8 +258,9 @@ describe('evaluator', () => { }, }, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate eq compare op to false', async () => { @@ -247,8 +271,9 @@ describe('evaluator', () => { timesCounter: 7, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate ref eq compare op to false', async () => { @@ -260,8 +285,9 @@ describe('evaluator', () => { timesCounterRef: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); @@ -274,8 +300,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref neq compare op to true', async () => { @@ -287,8 +314,9 @@ describe('evaluator', () => { timesCounterRef: 9, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate neq compare op to false', async () => { @@ -299,8 +327,9 @@ describe('evaluator', () => { timesCounter: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate ref neq compare op to false', async () => { @@ -312,8 +341,9 @@ describe('evaluator', () => { timesCounterRef: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate math ref neq compare op to false', async () => { @@ -325,8 +355,9 @@ describe('evaluator', () => { timesCounterRef: 6, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); @@ -340,8 +371,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref gt compare op to true', async () => { @@ -353,8 +385,9 @@ describe('evaluator', () => { timesCounterRef: 4, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate math ref gt compare op to true', async () => { @@ -366,8 +399,9 @@ describe('evaluator', () => { timesCounterRef: 1, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate gt compare op to false', async () => { @@ -378,8 +412,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate ref gt compare op to false', async () => { @@ -391,8 +426,9 @@ describe('evaluator', () => { timesCounterRef: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate gt compare op to false 2', async () => { @@ -403,8 +439,9 @@ describe('evaluator', () => { timesCounter: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); @@ -418,8 +455,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref gte compare op to true', async () => { @@ -431,8 +469,9 @@ describe('evaluator', () => { timesCounterRef: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate math ref gte compare op to true', async () => { @@ -450,8 +489,9 @@ describe('evaluator', () => { timesCounterRefDivider: 2, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate gte compare op to true 2', async () => { @@ -462,8 +502,9 @@ describe('evaluator', () => { timesCounter: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate gte compare op to false', async () => { @@ -474,8 +515,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); @@ -488,8 +530,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate between compare op to true', async () => { @@ -500,8 +543,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate between left ref compare op to true', async () => { @@ -513,8 +557,9 @@ describe('evaluator', () => { timesCounterRefLeft: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate between left ref compare op and right math op to true', async () => { @@ -532,8 +577,9 @@ describe('evaluator', () => { timesCounterRefLeft: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate between right ref compare op to true', async () => { @@ -545,8 +591,9 @@ describe('evaluator', () => { timesCounterRefRight: 10, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate between compare op to true low equal', async () => { @@ -557,8 +604,9 @@ describe('evaluator', () => { timesCounter: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate between compare op to true high equal', async () => { @@ -569,8 +617,9 @@ describe('evaluator', () => { timesCounter: 10, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate between compare op to false', async () => { @@ -581,18 +630,20 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should fail on empty between compare op', async () => { const expression = { timesCounter: {between: [] as any}, }; + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter.length must be 2'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter.length must be 2'); }); @@ -600,10 +651,11 @@ describe('evaluator', () => { const expression = { timesCounter: {between: [1] as any}, }; + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter.length must be 2'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter.length must be 2'); }); @@ -611,10 +663,11 @@ describe('evaluator', () => { const expression = { timesCounter: {between: [1, 2, 3] as any}, }; + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter.length must be 2'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter.length must be 2'); }); @@ -622,10 +675,11 @@ describe('evaluator', () => { const expression = { timesCounter: {between: ['s', 4] as any}, }; + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter[0] must be a number'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter[0] must be a number'); }); @@ -633,10 +687,11 @@ describe('evaluator', () => { const expression = { timesCounter: {between: [4, 's'] as any}, }; + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter[1] must be a number'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter[1] must be a number'); }); @@ -644,10 +699,11 @@ describe('evaluator', () => { const expression = { timesCounter: {between: [4, 3] as any}, }; + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter first value is higher than second value'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter first value is higher than second value'); }); }); @@ -661,8 +717,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref inq op to true (number)', async () => { @@ -674,8 +731,9 @@ describe('evaluator', () => { timesCounterRef: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate math ref inq op to true (number)', async () => { @@ -687,8 +745,9 @@ describe('evaluator', () => { timesCounterRef: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate inq op to true (string)', async () => { @@ -699,8 +758,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate inq op to true (string)', async () => { @@ -712,8 +772,9 @@ describe('evaluator', () => { userId: 'a', userIdRef: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate inq op to false (number)', async () => { @@ -724,8 +785,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate inq op to false (string)', async () => { @@ -736,8 +798,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); @@ -751,8 +814,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate nin op to true (string)', async () => { @@ -763,8 +827,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate nin op to false (number)', async () => { @@ -775,8 +840,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate ref nin op to false (number)', async () => { @@ -788,8 +854,9 @@ describe('evaluator', () => { timesCounterRef: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate math ref nin op to false (number)', async () => { @@ -801,8 +868,9 @@ describe('evaluator', () => { timesCounterRef: 2, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate nin op to false (string)', async () => { @@ -813,8 +881,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); @@ -828,8 +897,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'aBdC', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref regexp op to true', async () => { const expression = { @@ -840,8 +910,9 @@ describe('evaluator', () => { userId: 'aBdC', userIdRegex: '^a.+C$', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate regexpi op to false case sensitive', async () => { const expression = { @@ -851,8 +922,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'aBdc', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate regexp op to false', async () => { const expression = { @@ -862,8 +934,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); @@ -877,8 +950,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'aBdC', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref regexpi op to true', async () => { const expression = { @@ -889,8 +963,9 @@ describe('evaluator', () => { userId: 'aBdC', userIdRegex: '^a.+C$', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate regexpi op to true case insensitive', async () => { const expression = { @@ -900,8 +975,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'aBdc', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate regexpi op to false', async () => { const expression = { @@ -911,8 +987,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); @@ -926,8 +1003,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref lt compare op to true', async () => { @@ -939,8 +1017,9 @@ describe('evaluator', () => { timesCounterRef: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate math ref lt compare op to true', async () => { @@ -952,8 +1031,9 @@ describe('evaluator', () => { timesCounterRef: 4, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate lt compare lt to false', async () => { @@ -964,8 +1044,9 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate lt compare op to false 2', async () => { @@ -976,8 +1057,9 @@ describe('evaluator', () => { timesCounter: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); @@ -990,8 +1072,9 @@ describe('evaluator', () => { timesCounter: 3, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate ref lte compare op to true', async () => { @@ -1003,8 +1086,9 @@ describe('evaluator', () => { timesCounterRef: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate math ref lte compare op to true', async () => { @@ -1016,8 +1100,9 @@ describe('evaluator', () => { timesCounterRef: 6, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate lte compare op to true 2', async () => { @@ -1028,8 +1113,9 @@ describe('evaluator', () => { timesCounter: 5, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate lte compare op to false', async () => { @@ -1040,19 +1126,46 @@ describe('evaluator', () => { timesCounter: 8, userId: 'a', }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); }); + it('should pass run opts to functions', async () => { + const expression = {userComplex: 'r@a.com'}; + expect(await validate(expression, { + userId: '-', + timesCounter: 8, + }, functionsTable, {dryRun: true})).to.be.an('undefined'); + await expect(validate(expression, { + userId: '-', + timesCounter: 8, + }, functionsTable, {dryRun: false})) + .to.eventually.rejectedWith(Error, 'Failed user validation'); + expect(await evaluate(expression, { + userId: 'r@a.com', + timesCounter: 8, + }, functionsTable, {dryRun: false})).to.eql(true); + expect(await evaluate(expression, { + userId: '-', + timesCounter: 8, + }, functionsTable, {dryRun: false})).to.eql(false); + expect(await evaluate(expression, { + userId: '-', + timesCounter: 8, + }, functionsTable, {dryRun: true})).to.eql(true); + }); + it('should evaluate a single function', async () => { const expression = {user: 'r@a.com'}; const context = { userId: 'r@a.com', timesCounter: 8, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate a single not function to false', async () => { @@ -1061,8 +1174,9 @@ describe('evaluator', () => { userId: 'r@a.com', timesCounter: 8, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate a single not function to true', async () => { @@ -1071,8 +1185,9 @@ describe('evaluator', () => { userId: 'r@a.com', timesCounter: 8, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate a single and function to true', async () => { @@ -1081,8 +1196,9 @@ describe('evaluator', () => { userId: 'r@a.com', timesCounter: 8, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate a single or function to true', async () => { @@ -1091,8 +1207,9 @@ describe('evaluator', () => { userId: 'r@a.com', timesCounter: 8, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(true); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(true); }); it('should evaluate a single and function to false', async () => { @@ -1101,8 +1218,9 @@ describe('evaluator', () => { userId: 'r@a.com', timesCounter: 8, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should evaluate a single or function to false', async () => { @@ -1111,173 +1229,193 @@ describe('evaluator', () => { userId: 'r@a.com', timesCounter: 8, }; - expect(await validate(expression, context, functionsTable)).to.be.an('undefined'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + expect(await validate(expression, context, functionsTable, runOpts)).to.be.an('undefined'); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should fail on empty or op', async () => { const expression = {or: []}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - or operator must have at least one expression'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - or operator must have at least one expression'); }); it('should fail on empty and op', async () => { const expression = {and: []}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - and operator must have at least one expression'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - and operator must have at least one expression'); }); it('should fail on non existing property', async () => { const expression: any = {and: [{dummy: 1}]}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - unknown context key dummy'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should fail on non existing property ref', async () => { const expression: any = {and: [{userId: {eq: {ref: 'fsdf'}}}]}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - unknown context key fsdf'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should fail on non existing math op', async () => { const expression: any = {and: [{timesCounter: {eq: {op: 'y', lhs: 1, rhs: 2}}}]}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter has invalid math operand y'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter has invalid math operand y'); }); it('should fail on non number math parameter', async () => { const expression: any = {and: [{timesCounter: {eq: {op: '+', lhs: 1, rhs: {ref: 'userId'}}}}]}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter must be a number'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter must be a number'); }); it('should fail on non number math parameter 2', async () => { const expression: any = {and: [{timesCounter: {eq: {op: '+', rhs: 1, lhs: {ref: 'userId'}}}}]}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter must be a number'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter must be a number'); }); it('should fail on non existing nested property', async () => { const expression: any = {and: [{'dummy.value': 1}]}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - unknown context key dummy'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should fail on non existing nested property 2', async () => { const expression: any = {and: [{'dummy.value': 1}]}; const context = {userId: 'r@a.com', timesCounter: 8, dummy: {value2: 5}}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - unknown context key dummy'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should fail on non existing property 2', async () => { const expression: any = {dummy: 1}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - unknown context key dummy'); - expect(await evaluate(expression, context, functionsTable)).to.eql(false); + expect(await evaluate(expression, context, functionsTable, runOpts)).to.eql(false); }); it('should fail on non existing op', async () => { const expression: any = {userId: {bk: 1}}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - unknown op bk'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - unknown op bk'); }); it('should fail on non number op', async () => { const expression: any = {timesCounter: {gt: 'sdf'}}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter must be a number'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter must be a number'); }); it('should fail on non number op ref', async () => { const expression: any = {timesCounter: {gt: {ref: 'userId'}}}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter must be a number'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - timesCounter must be a number'); }); it('should fail on non string op', async () => { const expression: any = {userId: {regexp: 5}}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - userId must be a string'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - userId must be a string'); }); it('should fail on non string context', async () => { const expression: any = {timesCounter: {regexp: 's'}}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid context - timesCounter must be a string'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid context - timesCounter must be a string'); }); it('should fail on non number context', async () => { const expression: any = {userId: {gte: 5}}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid context - userId must be a number'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid context - userId must be a number'); }); it('should fail too many keys to op', async () => { const expression: any = {userId: {eq: 1, nq: 2}}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - too may keys'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - too may keys'); }); it('should fail too many keys', async () => { const expression: any = {timesCounter: 1, userId: 'a'}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - too may keys'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - too may keys'); }); it('should fail too many keys 2', async () => { const expression: any = {or: [{userId: 1, timesCounter: 'a'}]}; const context = {userId: 'r@a.com', timesCounter: 8}; - await expect(validate(expression, context, functionsTable)) + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await expect(validate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - too may keys'); - await expect(evaluate(expression, context, functionsTable)) + await expect(evaluate(expression, context, functionsTable, runOpts)) .to.eventually.rejectedWith(Error, 'Invalid expression - too may keys'); }); @@ -1306,10 +1444,11 @@ describe('evaluator', () => { }, ], }; - await validate(expression, context, fnTable); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await validate(expression, context, fnTable, runOpts); expect(fnCounter).to.eql(4); fnCounter = 0; - await evaluate(expression, context, fnTable); + await evaluate(expression, context, fnTable, runOpts); expect(fnCounter).to.eql(3); }); @@ -1338,10 +1477,12 @@ describe('evaluator', () => { ], }; const context = {}; - await validate(expression, context, fnTable); + const runOpts: CustomEvaluatorFuncRunOptions = {dryRun: false}; + await validate( + expression, context, fnTable, runOpts); expect(fnCounter).to.eql(4); fnCounter = 0; - await evaluate(expression, context, fnTable); + await evaluate(expression, context, fnTable, runOpts); expect(fnCounter).to.eql(3); }); }); diff --git a/src/test/mocha.opts b/src/test/mocha.opts deleted file mode 100644 index 55325c9..0000000 --- a/src/test/mocha.opts +++ /dev/null @@ -1,5 +0,0 @@ ---reporter spec ---require ts-node/register ---require source-map-support/register ---recursive -src/test/**/*.spec.ts diff --git a/src/test/types/deep.test-d.ts b/src/test/types/deep.test-d.ts index 31aeaae..7619cc9 100644 --- a/src/test/types/deep.test-d.ts +++ b/src/test/types/deep.test-d.ts @@ -2,11 +2,13 @@ import {ResolvedConsequence, Rule} from '../../index'; import {expectType} from 'tsd'; type ExpressionFunction1 = { - user: (user: string, context: { userId: string }) => boolean; + user: (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}) => boolean; } type ExpressionFunction2 = { - user: (user: string, context: { userId: string }) => boolean; + user: (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}) => boolean; } type Context1 = { @@ -43,8 +45,8 @@ type RuleFunctionsTable2 = { rule1: () => void | ResolvedConsequence } -type Rule1 = Rule; -type Rule2 = Rule; +type Rule1 = Rule; +type Rule2 = Rule; declare const rule1: Rule1; declare const rule2: Rule2; diff --git a/src/test/types/evaluator.test-d.ts b/src/test/types/evaluator.test-d.ts index fe66c08..3a8201b 100644 --- a/src/test/types/evaluator.test-d.ts +++ b/src/test/types/evaluator.test-d.ts @@ -2,7 +2,13 @@ import {ExpressionHandler} from '../../index'; import {expectError, expectType} from 'tsd'; type ExpressionFunction = { - user: (user: string, context: { userId: string }) => boolean; + user: (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dryRun: boolean}}) => boolean; +} + +type ErroredExpressionFunction = { + user: (user: string, context: { userId: string }, + runOpts: {validation: boolean, custom: {dummy: boolean}}) => boolean; } type Context = { @@ -22,101 +28,163 @@ type BadValidationContext = { }; } -type TestExpressionEval = ExpressionHandler; +type Ignore = never; +type CustomEvaluatorFuncRunOptions = {dryRun: boolean}; + +type TestExpressionEval = ExpressionHandler; declare const functions: ExpressionFunction; +declare const erroredFunctions: ErroredExpressionFunction; declare const validationContext: BadValidationContext; declare const expressionEval: TestExpressionEval; +declare const runOpts: CustomEvaluatorFuncRunOptions; -expectError(expressionEval.validate(validationContext)); +expectError(expressionEval.validate(validationContext, runOpts)); -expectError(new ExpressionHandler({}, functions)); -expectError(new ExpressionHandler({userId: 5}, functions)); +expectError(new ExpressionHandler({}, functions)); +expectError(new ExpressionHandler({userId: 5}, functions)); const a = {userId: 'f', timesCounter: 5}; -expectError(new ExpressionHandler(a, functions)); -expectError(new ExpressionHandler({ +expectError(new ExpressionHandler(a, functions)); +expectError(new ExpressionHandler({ and: [{ timesCounter: { ne: 'sdf', }, }], }, functions)); -expectError(new ExpressionHandler({and: [], or: []}, functions)); -expectError(new ExpressionHandler({and: [], not: []}, functions)); -expectError(new ExpressionHandler({or: [], not: []}, functions)); -expectError(new ExpressionHandler({or: [], userId: 'dfg'}, functions)); -expectError(new ExpressionHandler({user: {eq: 'sdf'}}, functions)); -expectError(new ExpressionHandler({userId: {eq: 5}}, functions)); -expectType(new ExpressionHandler({userId: {eq: 'sdf'}}, functions)); -expectType(new ExpressionHandler({userId: {neq: 'sdf'}}, functions)); -expectError(new ExpressionHandler({user: 5}, functions)); -expectType(new ExpressionHandler({user: 'sdf'}, functions)); -expectError(new ExpressionHandler({userId: 5}, functions)); -expectType(new ExpressionHandler({userId: 'sdf'}, functions)); -expectError(new ExpressionHandler({nested: {value: 5}}, functions)); -expectError(new ExpressionHandler({'nested.value': 'sdf'}, functions)); -expectError(new ExpressionHandler({'nested.valu2e': 'sdf'}, functions)); -expectType(new ExpressionHandler({'nested.value': 5}, functions)); -expectError(new ExpressionHandler({timesCounter: {neq: 'sdf'}}, functions)); -expectError(new ExpressionHandler( +expectError(new ExpressionHandler({and: [], or: []}, functions)); +expectError(new ExpressionHandler({and: [], not: []}, functions)); +expectError(new ExpressionHandler({or: [], not: []}, functions)); +expectError(new ExpressionHandler({or: [], userId: 'dfg'}, functions)); +expectError(new ExpressionHandler({user: {eq: 'sdf'}}, functions)); +expectError(new ExpressionHandler({userId: {eq: 5}}, functions)); +expectType(new ExpressionHandler({userId: {eq: 'sdf'}}, functions)); +expectType(new ExpressionHandler({userId: {neq: 'sdf'}}, functions)); +expectError(new ExpressionHandler({user: 5}, functions)); +expectType(new ExpressionHandler({user: 'sdf'}, functions)); +expectError(new ExpressionHandler({userId: 5}, functions)); +expectType(new ExpressionHandler({userId: 'sdf'}, functions)); +expectError(new ExpressionHandler({nested: {value: 5}}, functions)); +expectError(new ExpressionHandler({'nested.value': 'sdf'}, functions)); +expectError(new ExpressionHandler({'nested.valu2e': 'sdf'}, functions)); +expectType(new ExpressionHandler({'nested.value': 5}, functions)); +expectError(new ExpressionHandler({timesCounter: {neq: 'sdf'}}, functions)); +expectError(new ExpressionHandler( {timesCounter: {neq: {ref:'nested.value333'}}}, functions)); -expectError(new ExpressionHandler( +expectError(new ExpressionHandler( {timesCounter: {neq: {op: '+', lhs:5, rhs: {ref:'nested.value333'}}}}, functions)); -expectError(new ExpressionHandler( +expectError(new ExpressionHandler( {userId: {inq: [{op: '+', lhs:5, rhs: 4}]}}, functions)); -expectError(new ExpressionHandler( +expectError(new ExpressionHandler( {userId: {nin: [{op: '+', lhs:5, rhs: 4}]}}, functions)); -expectError(new ExpressionHandler( +expectError(new ExpressionHandler( {userId: {eq: {op: '+', lhs:5, rhs: 4}}}, functions)); -expectError(new ExpressionHandler( +expectError(new ExpressionHandler( {userId: {neq: {op: '+', lhs:5, rhs: 4}}}, functions)); -expectError(new ExpressionHandler( +expectError(new ExpressionHandler( {userId: {regexp: {op: '+', lhs:5, rhs: 4}}}, functions)); -expectError(new ExpressionHandler( +expectError(new ExpressionHandler( {userId: {regexpi: {op: '+', lhs:5, rhs: 4}}}, functions)); -expectError(new ExpressionHandler( +expectError(new ExpressionHandler( {timesCounter: {neq: {op: 'dummy', lhs:5, rhs: 6}}}, functions)); -expectType(new ExpressionHandler({timesCounter: {neq: {ref:'nested.value'}}}, functions)); -expectType(new ExpressionHandler( +expectType(new ExpressionHandler({timesCounter: {neq: {ref:'nested.value'}}}, functions)); +expectType(new ExpressionHandler( {timesCounter: {neq: {op: '+', lhs: {ref:'nested.value'}, rhs: 5}}}, functions)); -expectType(new ExpressionHandler({timesCounter: {neq: 5}}, functions)); -expectType(new ExpressionHandler({timesCounter: {eq: 5}}, functions)); -expectType(new ExpressionHandler({timesCounter: {gt: 5}}, functions)); -expectType(new ExpressionHandler({timesCounter: {gte: 5}}, functions)); -expectType(new ExpressionHandler({timesCounter: {lt: 5}}, functions)); -expectType(new ExpressionHandler({timesCounter: {lte: 5}}, functions)); +expectType(new ExpressionHandler({timesCounter: {neq: 5}}, functions)); +expectType(new ExpressionHandler({timesCounter: {eq: 5}}, functions)); +expectType(new ExpressionHandler({timesCounter: {gt: 5}}, functions)); +expectType(new ExpressionHandler({timesCounter: {gte: 5}}, functions)); +expectType(new ExpressionHandler({timesCounter: {lt: 5}}, functions)); +expectType(new ExpressionHandler({timesCounter: {lte: 5}}, functions)); // inq -expectType(new ExpressionHandler +expectType(new ExpressionHandler ({timesCounter: {inq: [4, 5, 6]}}, functions)); -expectType(new ExpressionHandler +expectType(new ExpressionHandler ({userId: {inq: ['a', 'b', 'c']}}, functions)); -expectError(new ExpressionHandler({timesCounter: {inq: ['s']}}, functions)); -expectError(new ExpressionHandler({userId: {inq: [5]}}, functions)); +expectError(new ExpressionHandler({timesCounter: {inq: ['s']}}, functions)); +expectError(new ExpressionHandler({userId: {inq: [5]}}, functions)); // nin -expectType(new ExpressionHandler +expectType(new ExpressionHandler ({timesCounter: {nin: [4, 5, 6]}}, functions)); -expectType(new ExpressionHandler +expectType(new ExpressionHandler ({userId: {nin: ['a', 'b', 'c']}}, functions)); -expectError(new ExpressionHandler({timesCounter: {nin: ['s']}}, functions)); -expectError(new ExpressionHandler({userId: {nin: [5]}}, functions)); +expectError(new ExpressionHandler({timesCounter: {nin: ['s']}}, functions)); +expectError(new ExpressionHandler({userId: {nin: [5]}}, functions)); // regexp -expectType(new ExpressionHandler +expectType(new ExpressionHandler ({userId: {regexp: 'sdf'}}, functions)); -expectError(new ExpressionHandler({timesCounter: {regexp: 'sdf'}}, functions)); +expectError(new ExpressionHandler({timesCounter: {regexp: 'sdf'}}, functions)); // regexpi -expectType(new ExpressionHandler +expectType(new ExpressionHandler ({userId: {regexpi: 'sdf'}}, functions)); -expectError(new ExpressionHandler({timesCounter: {regexpi: 'sdf'}}, functions)); +expectError(new ExpressionHandler({timesCounter: {regexpi: 'sdf'}}, functions)); // between -expectType(new ExpressionHandler +expectType(new ExpressionHandler ({timesCounter: {between: [4, 5]}}, functions)); -expectError(new ExpressionHandler({timesCounter: {between: [4]}}, functions)); -expectError(new ExpressionHandler({timesCounter: {between: [4, 5, 6]}}, functions)); -expectError(new ExpressionHandler({timesCounter: {userId: [4, 5]}}, functions)); -expectError(new ExpressionHandler({timesCounter: {between: []}}, functions)); -expectError(new ExpressionHandler({timesCounter: {between: ['s']}}, functions)); +expectError(new ExpressionHandler({timesCounter: {between: [4]}}, functions)); +expectError(new ExpressionHandler({timesCounter: {between: [4, 5, 6]}}, functions)); +expectError(new ExpressionHandler({timesCounter: {userId: [4, 5]}}, functions)); +expectError(new ExpressionHandler({timesCounter: {between: []}}, functions)); +expectError(new ExpressionHandler({timesCounter: {between: ['s']}}, functions)); +expectError(new ExpressionHandler({timesCounter: {between: [4, 5]}}, erroredFunctions)); diff --git a/src/test/types/expressionParts.ts b/src/test/types/expressionParts.ts index 37488a5..80c1dfc 100644 --- a/src/test/types/expressionParts.ts +++ b/src/test/types/expressionParts.ts @@ -22,7 +22,7 @@ type ExpressionFunction = { boolArrFn: (a: boolean[], context: { str: string }) => boolean; }; -type Result = Any.Compute>; +type Result = Any.Compute>; type Expected = { 'nested.value': { @@ -99,7 +99,8 @@ declare var e: Expected; r = e; e = r; -type ResultExtended = Any.Compute>; +type ResultExtended = Any.Compute>; type ExpectedExtended = { 'nested.value': { diff --git a/src/types/engine.ts b/src/types/engine.ts index 8e215bc..282d5d7 100644 --- a/src/types/engine.ts +++ b/src/types/engine.ts @@ -24,29 +24,36 @@ export interface RuleConsequence, Ignore = never> { - condition: Expression; +export interface RuleDefinition, Ignore, CustomEngineRuleFuncRunOptions> { + condition: Expression; consequence: RuleConsequence; } -export type EngineRuleFuncRunOptions = { +export type EngineRuleFuncRunOptions = { + custom: CustomEngineRuleFuncRunOptions; validation: boolean; } -export type RuleFunc = ( - param: any, context: C, runOptions: EngineRuleFuncRunOptions) => void | ResolvedConsequence - | Promise<(void | ResolvedConsequence)>; +export type RuleFunc = ( + param: any, context: C, runOptions: EngineRuleFuncRunOptions) + => void | ResolvedConsequence | Promise<(void | ResolvedConsequence)>; -export type RuleFunctionsTable = Record>; +export type RuleFunctionsTable = + Record>; export type RuleFunctionParam, K extends keyof RF> = Awaited[0]>; + RF extends RuleFunctionsTable, + K extends keyof RF, CustomEngineRuleFuncRunOptions> = Awaited[0]>; export type RuleFunctionsParams> = { - [K in keyof RF]: RuleFunctionParam; + RF extends RuleFunctionsTable, CustomEngineRuleFuncRunOptions> + = { + [K in keyof RF]: RuleFunctionParam; } -export type Rule, - C extends Context, F extends FunctionsTable, Ignore = never> = - RuleDefinition | RequireOnlyOne>; +export type Rule, C extends Context, F extends FunctionsTable, + Ignore, CustomEngineRuleFuncRunOptions> = + RuleDefinition | + RequireOnlyOne>; diff --git a/src/types/evaluator.ts b/src/types/evaluator.ts index a18e370..bb1b9ad 100644 --- a/src/types/evaluator.ts +++ b/src/types/evaluator.ts @@ -2,7 +2,8 @@ import {Object, String, Union} from 'ts-toolbelt'; import {Paths} from './paths'; import {NonNullable} from './required'; -export type FuncCompareOp, K extends keyof F> = +export type FuncCompareOp, + K extends keyof F, CustomEvaluatorFuncRunOptions> = Awaited[0]>; export type StringPaths = any extends O ? @@ -78,8 +79,9 @@ export interface RegexiCompareOp { regexpi: string | PropertyRef; } -export type FuncCompares> = { - [K in keyof F]: FuncCompareOp; +export type FuncCompares, + CustomEvaluatorFuncRunOptions> = { + [K in keyof F]: FuncCompareOp; } export type NumberCompareOps = @@ -104,36 +106,44 @@ export type PropertyCompareOps = { : never; }; -export interface AndCompareOp, Ignore> { - and: Expression[]; +export interface AndCompareOp, + Ignore, CustomEvaluatorFuncRunOptions> { + and: Expression[]; } -export interface OrCompareOp, Ignore> { - or: Expression[]; +export interface OrCompareOp, + Ignore, CustomEvaluatorFuncRunOptions> { + or: Expression[]; } -export interface NotCompareOp, Ignore> { - not: Expression; +export interface NotCompareOp, + Ignore, CustomEvaluatorFuncRunOptions> { + not: Expression; } export type RequireOnlyOne = Object.Either; -export type FullExpression, Ignore> = - NotCompareOp & - OrCompareOp & - AndCompareOp & - FuncCompares & +export type FullExpression, + Ignore, CustomEvaluatorFuncRunOptions> = + NotCompareOp & + OrCompareOp & + AndCompareOp & + FuncCompares & PropertyCompareOps; -export type Expression, Ignore = never> = - RequireOnlyOne>; +export type Expression, + Ignore, CustomEvaluatorFuncRunOptions> = + RequireOnlyOne>; -export type EvaluatorFuncRunOptions = { +export type EvaluatorFuncRunOptions = { + custom: CustomEvaluatorFuncRunOptions; validation: boolean; } -export type Func = (param: any, context: T, runOptions: EvaluatorFuncRunOptions) => boolean | Promise; +export type Func = ( + param: any, context: T, runOptions: EvaluatorFuncRunOptions) => + boolean | Promise; -export type FunctionsTable = Record>; +export type FunctionsTable = Record>; export type Context = Record; diff --git a/src/types/expressionParts.ts b/src/types/expressionParts.ts index 7d66bcf..c4a7e89 100644 --- a/src/types/expressionParts.ts +++ b/src/types/expressionParts.ts @@ -5,15 +5,17 @@ import {Function, String, Object} from 'ts-toolbelt'; type GetPartType = V extends string ? 'string' : V extends number ? 'number' : V extends boolean ? 'boolean' : V extends Array ? GetPartType : never; -interface ExpressionFunctionPart, K extends keyof F> { +interface ExpressionFunctionPart, + K extends keyof F, CustomEvaluatorFuncRunOptions> { type: GetPartType[0]>; isArray: Function.Parameters[0] extends Array ? true : false; propertyPath: K; isFunction: true; } -type ExpressionFunctionParts, Extra extends object> = { - [K in keyof F]: ExpressionFunctionPart & Extra; +type ExpressionFunctionParts, + Extra extends object, CustomEvaluatorFuncRunOptions> = { + [K in keyof F]: ExpressionFunctionPart & Extra; } interface ExpressionContextPart { @@ -30,5 +32,7 @@ type ExpressionContextParts = { : never; } -export type ExpressionParts, Extra extends object = {}, Ignore = never> = - ExpressionFunctionParts & Object.Filter, never, 'equals'>; +export type ExpressionParts, + Extra extends object, Ignore, CustomEvaluatorFuncRunOptions> = + ExpressionFunctionParts & + Object.Filter, never, 'equals'>; diff --git a/tsconfig.json b/tsconfig.json index a98c943..fa47a8f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2016", + "target": "ES2020", "module": "none", "moduleResolution": "node", "sourceMap": true, @@ -8,7 +8,7 @@ "outDir": "./dist", "strict": true, "lib": [ - "es6", + "ES2020", "dom" ] }, diff --git a/yarn.lock b/yarn.lock index b32bb84..a8e087a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,138 +2,273 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@ampproject/remapping@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@babel/highlight" "^7.16.7" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" -"@babel/generator@^7.18.2", "@babel/generator@^7.4.0": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== - dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + +"@babel/core@^7.7.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-environment-visitor@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" - integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.21.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" -"@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" +"@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + +"@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== +"@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== dependencies: - "@babel/types" "^7.16.7" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + "@jridgewell/trace-mapping" "0.3.9" -"@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.16.7", "@babel/parser@^7.18.5", "@babel/parser@^7.4.3": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" - integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== - -"@babel/template@^7.16.7", "@babel/template@^7.4.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.4.3": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd" - integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.5" - "@babel/types" "^7.18.4" - debug "^4.1.0" - globals "^11.1.0" + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" -"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4", "@babel/types@^7.4.0": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" - integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== +"@istanbuljs/nyc-config-typescript@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz#1f5235b28540a07219ae0dd42014912a0b19cf89" + integrity sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" + "@istanbuljs/schema" "^0.1.2" -"@istanbuljs/nyc-config-typescript@0.1.3": +"@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-0.1.3.tgz#944d15b3ebdb71f963a628daffaa25ade981bb86" - integrity sha512-EzRFg92bRSD1W/zeuNkeGwph0nkWf+pP2l/lYW4/5hav7RjKKBN5kV1Ix7Tvi0CMu3pC4Wi/U7rNisiJMR3ORg== + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" - integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.13" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" - integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -155,10 +290,30 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@tsd/typescript@~4.7.3": - version "4.7.4" - resolved "https://registry.yarnpkg.com/@tsd/typescript/-/typescript-4.7.4.tgz#f1e4e6c3099a174a0cb7aa51cf53f34f6494e528" - integrity sha512-jbtC+RgKZ9Kk65zuRZbKLTACf+tvFW4Rfq0JEMXrlmV3P3yme+Hm+pnb5fJRyt61SjIitcrC810wj7+1tgsEmg== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@tsd/typescript@~4.9.3": + version "4.9.5" + resolved "https://registry.yarnpkg.com/@tsd/typescript/-/typescript-4.9.5.tgz#85daafcf51f4af92bd8caf0e82b655ceaf948f99" + integrity sha512-+UgxOvJUl5rQdPFSSOOwhmSmpThm8DJ3HwHxAOq5XYe7CcmG1LcM2QeqWwILzUIT5tbeMqY8qABiCsRtIjk/2g== "@types/chai-as-promised@^7.1.5": version "7.1.5" @@ -167,15 +322,10 @@ dependencies: "@types/chai" "*" -"@types/chai@*": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.3.tgz#3c90752792660c4b562ad73b3fbd68bf3bc7ae07" - integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== - -"@types/chai@^4.2.16": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" - integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== +"@types/chai@*", "@types/chai@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" + integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== "@types/eslint@^7.2.13": version "7.29.0" @@ -186,9 +336,9 @@ "@types/json-schema" "*" "@types/estree@*": - version "0.0.52" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.52.tgz#7f1f57ad5b741f3d5b210d3b1f145640d89bf8fe" - integrity sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/json-schema@*": version "7.0.11" @@ -200,30 +350,48 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== -"@types/mocha@^8.2.2": - version "8.2.3" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" - integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== +"@types/mocha@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" + integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== -"@types/node@^14.14.37": - version "14.18.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.21.tgz#0155ee46f6be28b2ff0342ca1a9b9fd4468bef41" - integrity sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q== +"@types/node@^18.14.2": + version "18.14.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.2.tgz#c076ed1d7b6095078ad3cf21dfeea951842778b1" + integrity sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA== "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== -"@types/underscore@^1.11.1": +"@types/underscore@^1.11.4": version "1.11.4" resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^4.2.1: version "4.3.2" @@ -232,41 +400,39 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -append-transform@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" - integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== dependencies: - default-require-extensions "^2.0.0" + default-require-extensions "^3.0.0" archy@^1.0.0: version "1.0.0" @@ -285,22 +451,16 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -316,6 +476,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -324,7 +489,14 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.2: +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -336,6 +508,16 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== +browserslist@^4.21.3: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -346,23 +528,15 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== -caching-transform@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70" - integrity sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w== - dependencies: - hasha "^3.0.0" - make-dir "^2.0.0" - package-hash "^3.0.0" - write-file-atomic "^2.4.2" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" camelcase-keys@^6.2.2: version "6.2.2" @@ -378,6 +552,16 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001449: + version "1.0.30001458" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz#871e35866b4654a7d25eccca86864f411825540c" + integrity sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w== + chai-as-promised@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" @@ -385,20 +569,20 @@ chai-as-promised@^7.1.1: dependencies: check-error "^1.0.2" -chai@^4.3.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== +chai@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" - deep-eql "^3.0.1" + deep-eql "^4.1.2" get-func-name "^2.0.0" loupe "^2.3.1" pathval "^1.1.1" type-detect "^4.0.5" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0: +chalk@^2.0.0, chalk@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -420,14 +604,43 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" color-convert@^1.9.0: version "1.9.3" @@ -468,40 +681,26 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -convert-source-map@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cp-file@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" - integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== - dependencies: - graceful-fs "^4.1.2" - make-dir "^2.0.0" - nested-error-stacks "^2.0.0" - pify "^4.0.1" - safe-buffer "^5.0.1" +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -cross-spawn@^4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - integrity sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA== - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +cross-spawn@^7.0.0, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - ms "^2.1.1" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -debug@^4.1.0, debug@^4.1.1: +debug@4.3.4, debug@^4.1.0, debug@^4.1.1: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -509,9 +708,9 @@ debug@^4.1.0, debug@^4.1.1: ms "2.1.2" decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -521,32 +720,29 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -default-require-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" - integrity sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g== +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: - strip-bom "^3.0.0" + type-detect "^4.0.0" -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +default-require-extensions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" + integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" + strip-bom "^4.0.0" -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== diff@^4.0.1: version "4.0.2" @@ -560,10 +756,10 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +electron-to-chromium@^1.4.284: + version "1.4.312" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.312.tgz#e70a5b46252814ffc576b2c29032e1a559b9ad53" + integrity sha512-e7g+PzxzkbiCD1aNhdj+Tx3TLlfrQF/Lf+LAaUdoLvB1kCxf9wJimqXdWEqnoiYjFtxIR1hGBmoHsBIcCBNOMA== emoji-regex@^8.0.0: version "8.0.0" @@ -577,55 +773,22 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -655,9 +818,9 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -666,9 +829,9 @@ fast-glob@^3.2.9: micromatch "^4.0.4" fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -679,23 +842,24 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== +find-cache-dir@^3.2.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" + make-dir "^3.0.2" + pkg-dir "^4.1.0" -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - locate-path "^3.0.0" + locate-path "^6.0.0" + path-exists "^4.0.0" -find-up@^4.1.0: +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -703,47 +867,45 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -foreground-child@^1.5.6: - version "1.5.6" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" - integrity sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g== +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: - cross-spawn "^4" - signal-exit "^3.0.0" + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -753,34 +915,22 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -789,7 +939,7 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1, glob@^7.1.3: +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -818,26 +968,16 @@ globby@^11.0.1: merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: +graceful-fs@^4.1.15: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -848,25 +988,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -874,12 +995,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hasha@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-3.0.0.tgz#52a32fab8569d41ca69a61ff1a214f8eb7c8bd39" - integrity sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w== +hasha@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: - is-stream "^1.0.1" + is-stream "^2.0.0" + type-fest "^0.8.0" he@1.2.0: version "1.2.0" @@ -904,9 +1026,9 @@ html-escaper@^2.0.0: integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== imurmurhash@^0.1.4: version "0.1.4" @@ -931,98 +1053,47 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - irregular-plurals@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.3.0.tgz#67d0715d4361a60d9fd9ee80af3881c631a31ee2" - integrity sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g== + version "3.4.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.4.0.tgz#4be22a18af7c428e6480163d0de555e343b876db" + integrity sha512-YXxECO/W6N9aMBVKMKKZ8TXESgq7EFrp3emCGGUcrYY1cgJIeZjoB75MTu8qi+NAKntS9NwPU8VdcQ3r6E6aWQ== is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + binary-extensions "^2.0.0" is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.1: +is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -1033,121 +1104,107 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-weakref@^1.0.2: +is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== - -istanbul-lib-hook@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz#c95695f383d4f8f60df1f04252a9550e15b5b133" - integrity sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA== - dependencies: - append-transform "^1.0.0" - -istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== + dependencies: + append-transform "^2.0.0" + +istanbul-lib-instrument@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-processinfo@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" + integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== + dependencies: + archy "^1.0.0" + cross-spawn "^7.0.3" + istanbul-lib-coverage "^3.2.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^8.3.2" -istanbul-lib-report@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" -istanbul-lib-source-maps@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" + istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" - integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== +istanbul-reports@^3.0.2: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - argparse "^1.0.7" - esprima "^4.0.0" + argparse "^2.0.1" js-yaml@^3.13.1: version "3.14.1" @@ -1162,16 +1219,16 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -1182,24 +1239,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -1207,24 +1246,19 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== -lodash@^4.17.15: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -log-symbols@^4.0.0: +log-symbols@4.1.0, log-symbols@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -1233,19 +1267,18 @@ log-symbols@^4.0.0: is-unicode-supported "^0.1.0" loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" + yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" @@ -1254,13 +1287,12 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: - pify "^4.0.1" - semver "^5.6.0" + semver "^6.0.0" make-error@^1.1.1: version "1.3.6" @@ -1295,17 +1327,10 @@ meow@^9.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - -merge2@1.3.0, merge2@^1.3.0, merge2@^1.4.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: version "4.0.5" @@ -1320,12 +1345,12 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" @@ -1343,88 +1368,78 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.5, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mkdirp@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" - integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== - dependencies: - minimist "^1.2.5" +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp@^0.5.0, mkdirp@^0.5.3: +mkdirp@^0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mocha@^6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.3.tgz#e648432181d8b99393410212664450a4c1e31912" - integrity sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg== +mocha@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: - ansi-colors "3.2.3" + ansi-colors "4.1.1" browser-stdout "1.3.1" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" he "1.2.0" - js-yaml "3.13.1" - log-symbols "2.2.0" - minimatch "3.0.4" - mkdirp "0.5.4" - ms "2.1.1" - node-environment-flags "1.0.5" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -moment@^2.29.1: - version "2.29.3" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3" - integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw== - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +moment@^2.29.4: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nested-error-stacks@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" - integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -node-environment-flags@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" - integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" + process-on-spawn "^1.0.0" + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -1444,76 +1459,43 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" -nyc@^14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.1.1.tgz#151d64a6a9f9f5908a1b73233931e4a0a3075eeb" - integrity sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw== - dependencies: - archy "^1.0.0" - caching-transform "^3.0.2" - convert-source-map "^1.6.0" - cp-file "^6.2.0" - find-cache-dir "^2.1.0" - find-up "^3.0.0" - foreground-child "^1.5.6" - glob "^7.1.3" - istanbul-lib-coverage "^2.0.5" - istanbul-lib-hook "^2.0.7" - istanbul-lib-instrument "^3.3.0" - istanbul-lib-report "^2.0.8" - istanbul-lib-source-maps "^3.0.6" - istanbul-reports "^2.2.4" - js-yaml "^3.13.1" - make-dir "^2.1.0" - merge-source-map "^1.1.0" - resolve-from "^4.0.0" - rimraf "^2.6.3" +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +nyc@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== + dependencies: + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^2.0.0" + get-package-type "^0.1.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + make-dir "^3.0.0" + node-preload "^0.2.1" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" signal-exit "^3.0.2" - spawn-wrap "^1.4.2" - test-exclude "^5.2.3" - uuid "^3.3.2" - yargs "^13.2.2" - yargs-parser "^13.0.0" - -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-keys@^1.0.11, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== - dependencies: - array.prototype.reduce "^1.0.4" - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.1" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + yargs "^15.0.2" once@^1.3.0: version "1.4.0" @@ -1522,24 +1504,19 @@ once@^1.3.0: dependencies: wrappy "1" -os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-limit "^2.0.0" + yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" @@ -1548,29 +1525,35 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-3.0.0.tgz#50183f2d36c9e3e528ea0a8605dff57ce976f88e" - integrity sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA== +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== dependencies: graceful-fs "^4.1.15" - hasha "^3.0.0" + hasha "^5.0.0" lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -1581,11 +1564,6 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -1596,18 +1574,16 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -1618,27 +1594,22 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -picomatch@^2.3.1: +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: - find-up "^3.0.0" + find-up "^4.0.0" plur@^4.0.0: version "4.0.0" @@ -1647,10 +1618,12 @@ plur@^4.0.0: dependencies: irregular-plurals "^3.2.0" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" queue-microtask@^1.2.2: version "1.2.3" @@ -1662,13 +1635,12 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" + safe-buffer "^5.1.0" read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: version "7.0.1" @@ -1679,15 +1651,6 @@ read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -1698,6 +1661,13 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -1706,15 +1676,6 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - release-zalgo@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" @@ -1732,10 +1693,10 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.10.0, resolve@^1.3.2: version "1.22.1" @@ -1751,10 +1712,10 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.6.2, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" @@ -1765,48 +1726,53 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@^5.0.1: +safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.4: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -1816,7 +1782,7 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -source-map-support@^0.5.17, source-map-support@^0.5.21: +source-map-support@^0.5.21: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -1829,17 +1795,17 @@ source-map@^0.6.0, source-map@^0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spawn-wrap@^1.4.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848" - integrity sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw== +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: - foreground-child "^1.5.6" - mkdirp "^0.5.0" - os-homedir "^1.0.1" - rimraf "^2.6.2" + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" signal-exit "^3.0.2" - which "^1.3.0" + which "^2.0.1" spdx-correct@^3.0.0: version "3.1.1" @@ -1863,33 +1829,16 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.12" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -1898,49 +1847,17 @@ string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-indent@^3.0.0: version "3.0.0" @@ -1949,17 +1866,17 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" supports-color@^5.3.0: version "5.5.0" @@ -1968,13 +1885,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1983,9 +1893,9 @@ supports-color@^7.0.0, supports-color@^7.1.0: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" @@ -1995,15 +1905,14 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: - glob "^7.1.3" + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" to-fast-properties@^2.0.0: version "2.0.0" @@ -2022,15 +1931,23 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -ts-node@^8.10.2: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== - dependencies: +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" arg "^4.1.0" + create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - source-map-support "^0.5.17" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" ts-toolbelt@^9.6.0: @@ -2038,12 +1955,12 @@ ts-toolbelt@^9.6.0: resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz#50a25426cfed500d4a09bd1b3afb6f28879edfd5" integrity sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w== -tsd@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/tsd/-/tsd-0.21.0.tgz#fb1a1aa022cfb4a6d1065bb569687e8ac8f72daf" - integrity sha512-6DugCw1Q4H8HYwDT3itzgALjeDxN4RO3iqu7gRdC/YNVSCRSGXRGQRRasftL1uKDuKxlFffYKHv5j5G7YnKGxQ== +tsd@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/tsd/-/tsd-0.25.0.tgz#bed2a937ab414e1c5ae1ca687bb44ea3a6f549ba" + integrity sha512-liUlvKtsdr+70XEZP/kkF6U8+Q9URZi4Pw58ih7a9x3kjJblG8rdVgvG62xcvkgRva1q3yWX5qAxfYZuYiC5CA== dependencies: - "@tsd/typescript" "~4.7.3" + "@tsd/typescript" "~4.9.3" eslint-formatter-pretty "^4.1.0" globby "^11.0.1" meow "^9.0.0" @@ -2101,30 +2018,40 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== -type-fest@^0.8.1: +type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typescript@4.6.4: - version "4.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" - integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + escalade "^3.1.1" + picocolors "^1.0.0" -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -2134,113 +2061,140 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== -which@1.3.1, which@^1.2.9, which@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: - string-width "^1.0.2 || 2" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^2.4.2: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: - graceful-fs "^4.1.11" imurmurhash "^0.1.4" + is-typedarray "^1.0.0" signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.2, yargs-parser@^13.0.0, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.3: +yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" -yargs@13.3.2, yargs@^13.2.2, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== +yargs@^15.0.2: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: - cliui "^5.0.0" - find-up "^3.0.0" + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" get-caller-file "^2.0.1" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^3.0.0" + string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.2" + yargs-parser "^18.1.2" yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==