From a2d56a3d67d0164f40b7a090c41afeb31529ece1 Mon Sep 17 00:00:00 2001 From: Ruben Date: Thu, 29 Feb 2024 10:07:44 +0100 Subject: [PATCH 01/15] Expose Model Classes at index Expose Flow, ScanResult & RuleResult at index --- src/index.ts | 12 ++++++++---- src/main/interfaces/IRuleDefinition.ts | 4 ++-- src/main/libs/Compiler.ts | 6 +++--- src/main/libs/FixFlows.ts | 6 +++--- src/main/libs/ScanFlows.ts | 6 +++--- src/main/models/Flow.ts | 2 +- src/main/models/RuleResult.ts | 2 +- src/main/models/ScanResult.ts | 6 +++--- src/main/rules/APIVersion.ts | 4 ++-- src/main/rules/CopyAPIName.ts | 4 ++-- src/main/rules/DMLStatementInLoop.ts | 4 ++-- src/main/rules/DuplicateDMLOperation.ts | 4 ++-- src/main/rules/FlowDescription.ts | 4 ++-- src/main/rules/FlowName.ts | 4 ++-- src/main/rules/HardcodedId.ts | 4 ++-- src/main/rules/MissingFaultPath.ts | 4 ++-- src/main/rules/MissingNullHandler.ts | 4 ++-- src/main/rules/SOQLQueryInLoop.ts | 4 ++-- src/main/rules/UnconnectedElement.ts | 4 ++-- src/main/rules/UnusedVariable.ts | 4 ++-- tests/DMLPreventedByHidingNav.test.ts | 10 ++++------ tests/DMLStatementInALoop_Demo.test.ts | 10 ++++------ tests/DMLStatementInALoop_Demo_Fixed.test.ts | 10 ++++------ tests/FlowNaming.test.ts | 10 ++++------ tests/FlowNamingException.test.ts | 10 ++++------ tests/FlowNamingTrue.test.ts | 10 ++++------ tests/MissingNullHandler.test.ts | 11 +++++------ tests/MissingNullHandler_CV2.test.ts | 11 +++++------ tests/MissingNullHandler_CV3.test.ts | 11 +++++------ tests/MissingNullHandler_Fixed.test.ts | 11 +++++------ tests/SOQLQueryInALoop_Demo.test.ts | 10 ++++------ tests/SOQLQueryInALoop_Demo_Fixed.test.ts | 10 ++++------ tests/UnconnectedElement.test.ts | 18 ++++++++---------- tests/copyOfFalseTest.test.ts | 10 ++++------ tests/copyOfTrueTest.test.ts | 10 ++++------ tests/demo_flowNamingConvention.test.ts | 10 ++++------ tests/demo_hardcodedId.test.ts | 10 ++++------ tests/demo_missingFaultPath.test.ts | 10 ++++------ tests/demo_missingFaultPathFixed.test.ts | 10 ++++------ tests/demo_missingFlowDescription.test.ts | 10 ++++------ ...plicateDMLOperationsByNav_exception.test.ts | 10 ++++------ ...cateDMLOperationsByNav_exceptiontwo.test.ts | 11 +++++------ ...perationsByNavigation_0InScreenFlow.test.ts | 10 ++++------ ...perationsByNavigation_1InScreenFlow.test.ts | 10 ++++------ ...Navigation_1UnconnectedInScreenFlow.test.ts | 10 ++++------ ...perationsByNavigation_2InScreenFlow.test.ts | 10 ++++------ ...eDMLOperationsByNavigation_NoResult.test.ts | 11 +++++------ tests/flowAPIVersion_AboveDFTH.test.ts | 10 ++++------ tests/flowAPIVersion_BelowTH.test.ts | 10 ++++------ tests/flowAPIVersion_Missing.test.ts | 10 ++++------ tests/getRules_findsAll.test.ts | 4 ++-- tests/missingFlowDescription_false.test.ts | 11 +++++------ tests/missingFlowDescription_true.test.ts | 11 +++++------ tests/multipleRulesAndFlows.test.ts | 16 +++++++--------- tests/noRulesProvided.test.ts | 13 +++++-------- tests/noRulesProvided2.test.ts | 12 +++++------- 56 files changed, 207 insertions(+), 266 deletions(-) diff --git a/src/index.ts b/src/index.ts index 45e8e67..3d4e45d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,10 +3,10 @@ import { IRulesConfig } from './main/interfaces/IRulesConfig'; import { FixFlows } from './main/libs/FixFlows'; import { GetRuleDefinitions } from './main/libs/GetRuleDefinitions'; import { ScanFlows } from './main/libs/ScanFlows'; -import { Flow } from './main/models/Flow'; +import Flow from './main/models/Flow'; import { ResultDetails } from './main/models/ResultDetails'; -import { RuleResult } from './main/models/RuleResult'; -import { ScanResult } from './main/models/ScanResult'; +import RuleResult from './main/models/RuleResult'; +import ScanResult from './main/models/ScanResult'; export function getRules(ruleNames?: string[]): IRuleDefinition[] { if (ruleNames && ruleNames.length > 0) { @@ -53,4 +53,8 @@ export function scan(flows: Flow[], ruleOptions?: IRulesConfig): ScanResult[] { export function fix(flows: Flow[]): ScanResult[] { return FixFlows(flows); -} \ No newline at end of file +} + +export { default as Flow } from './main/models/Flow'; +export { default as ScanResult } from './main/models/ScanResult'; +export { default as RuleResult } from './main/models/RuleResult'; \ No newline at end of file diff --git a/src/main/interfaces/IRuleDefinition.ts b/src/main/interfaces/IRuleDefinition.ts index 59b8d35..704ddc7 100644 --- a/src/main/interfaces/IRuleDefinition.ts +++ b/src/main/interfaces/IRuleDefinition.ts @@ -1,5 +1,5 @@ -import { Flow } from '../models/Flow'; -import { RuleResult } from '../models/RuleResult'; +import Flow from '../models/Flow'; +import RuleResult from '../models/RuleResult'; export interface IRuleDefinition { uri: string; diff --git a/src/main/libs/Compiler.ts b/src/main/libs/Compiler.ts index 14df36a..538eb65 100644 --- a/src/main/libs/Compiler.ts +++ b/src/main/libs/Compiler.ts @@ -1,4 +1,4 @@ -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowNode } from '../models/FlowNode'; export class Compiler { @@ -26,7 +26,7 @@ export class Compiler { traverseFlow(flow: Flow, startElementName: string, visitCallback: (element: FlowNode) => void) { // Iterative Deepening Depth-First Search (IDDFS) - let depth = 0; + // let depth = 0; let elementsToVisit = [startElementName]; while (elementsToVisit.length > 0) { @@ -44,8 +44,8 @@ export class Compiler { } elementsToVisit = nextElements; - depth++; // add logic to control depth or terminate the traversal based on requirements. + // depth++; } } diff --git a/src/main/libs/FixFlows.ts b/src/main/libs/FixFlows.ts index 75ec1b5..96b920d 100644 --- a/src/main/libs/FixFlows.ts +++ b/src/main/libs/FixFlows.ts @@ -1,9 +1,9 @@ -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowNode } from '../models/FlowNode'; import { FlowVariable } from '../models/FlowVariable'; import { ResultDetails } from '../models/ResultDetails'; -import { RuleResult } from '../models/RuleResult'; -import { ScanResult } from '../models/ScanResult'; +import RuleResult from '../models/RuleResult'; +import ScanResult from '../models/ScanResult'; import { UnconnectedElement } from '../rules/UnconnectedElement'; import { UnusedVariable } from '../rules/UnusedVariable'; import { BuildFlow } from './BuildFlow'; diff --git a/src/main/libs/ScanFlows.ts b/src/main/libs/ScanFlows.ts index 2e6e7b6..38a6af5 100644 --- a/src/main/libs/ScanFlows.ts +++ b/src/main/libs/ScanFlows.ts @@ -1,7 +1,7 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; -import { RuleResult } from '../models/RuleResult'; -import { ScanResult } from '../models/ScanResult'; +import Flow from '../models/Flow'; +import RuleResult from '../models/RuleResult'; +import ScanResult from '../models/ScanResult'; import { GetRuleDefinitions } from './GetRuleDefinitions'; import { keys } from './Keys'; diff --git a/src/main/models/Flow.ts b/src/main/models/Flow.ts index 348ecff..1d3ab1d 100644 --- a/src/main/models/Flow.ts +++ b/src/main/models/Flow.ts @@ -4,7 +4,7 @@ import { FlowElement } from './FlowElement'; import { FlowVariable } from './FlowVariable'; import * as p from 'path'; -export class Flow { +export default class Flow { public label: string; public xmldata; diff --git a/src/main/models/RuleResult.ts b/src/main/models/RuleResult.ts index a32facb..029b860 100644 --- a/src/main/models/RuleResult.ts +++ b/src/main/models/RuleResult.ts @@ -1,7 +1,7 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { ResultDetails } from './ResultDetails'; -export class RuleResult { +export default class RuleResult { public occurs: boolean; public ruleName: string; diff --git a/src/main/models/ScanResult.ts b/src/main/models/ScanResult.ts index 2258e2e..eabfed9 100644 --- a/src/main/models/ScanResult.ts +++ b/src/main/models/ScanResult.ts @@ -1,7 +1,7 @@ -import {Flow} from './Flow'; -import {RuleResult} from './RuleResult'; +import Flow from './Flow'; +import RuleResult from './RuleResult'; -export class ScanResult { +export default class ScanResult { constructor(flow: Flow, ruleResults: RuleResult[]) { this.flow = flow; diff --git a/src/main/rules/APIVersion.ts b/src/main/rules/APIVersion.ts index 3507055..1b37a9a 100644 --- a/src/main/rules/APIVersion.ts +++ b/src/main/rules/APIVersion.ts @@ -1,7 +1,7 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { ResultDetails } from '../models/ResultDetails'; import { FlowAttribute } from '../models/FlowAttribute'; diff --git a/src/main/rules/CopyAPIName.ts b/src/main/rules/CopyAPIName.ts index cd62834..26858e4 100644 --- a/src/main/rules/CopyAPIName.ts +++ b/src/main/rules/CopyAPIName.ts @@ -1,7 +1,7 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { FlowNode } from '../models/FlowNode'; import { ResultDetails } from '../models/ResultDetails'; diff --git a/src/main/rules/DMLStatementInLoop.ts b/src/main/rules/DMLStatementInLoop.ts index cae0b56..59f97b9 100644 --- a/src/main/rules/DMLStatementInLoop.ts +++ b/src/main/rules/DMLStatementInLoop.ts @@ -1,8 +1,8 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { ResultDetails } from '../models/ResultDetails'; import { Compiler } from '../libs/Compiler'; diff --git a/src/main/rules/DuplicateDMLOperation.ts b/src/main/rules/DuplicateDMLOperation.ts index 03c7e83..a7b5c9f 100644 --- a/src/main/rules/DuplicateDMLOperation.ts +++ b/src/main/rules/DuplicateDMLOperation.ts @@ -1,8 +1,8 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { ResultDetails } from '../models/ResultDetails'; diff --git a/src/main/rules/FlowDescription.ts b/src/main/rules/FlowDescription.ts index f673ac4..a097763 100644 --- a/src/main/rules/FlowDescription.ts +++ b/src/main/rules/FlowDescription.ts @@ -1,7 +1,7 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { FlowAttribute } from '../models/FlowAttribute'; import { ResultDetails } from '../models/ResultDetails'; diff --git a/src/main/rules/FlowName.ts b/src/main/rules/FlowName.ts index 9a98632..6de1518 100644 --- a/src/main/rules/FlowName.ts +++ b/src/main/rules/FlowName.ts @@ -1,7 +1,7 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { FlowAttribute } from '../models/FlowAttribute'; import { ResultDetails } from '../models/ResultDetails'; diff --git a/src/main/rules/HardcodedId.ts b/src/main/rules/HardcodedId.ts index a93217a..aab425a 100644 --- a/src/main/rules/HardcodedId.ts +++ b/src/main/rules/HardcodedId.ts @@ -1,8 +1,8 @@ import * as IdPrefixes from '../data/IdPrefixes.json'; import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { ResultDetails } from '../models/ResultDetails'; diff --git a/src/main/rules/MissingFaultPath.ts b/src/main/rules/MissingFaultPath.ts index 5d7e02f..c7470e6 100644 --- a/src/main/rules/MissingFaultPath.ts +++ b/src/main/rules/MissingFaultPath.ts @@ -1,8 +1,8 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { ResultDetails } from '../models/ResultDetails'; import { Compiler } from '../libs/Compiler'; diff --git a/src/main/rules/MissingNullHandler.ts b/src/main/rules/MissingNullHandler.ts index 61ceacb..cc63c90 100644 --- a/src/main/rules/MissingNullHandler.ts +++ b/src/main/rules/MissingNullHandler.ts @@ -1,8 +1,8 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { ResultDetails } from '../models/ResultDetails'; diff --git a/src/main/rules/SOQLQueryInLoop.ts b/src/main/rules/SOQLQueryInLoop.ts index 2963660..addf844 100644 --- a/src/main/rules/SOQLQueryInLoop.ts +++ b/src/main/rules/SOQLQueryInLoop.ts @@ -1,8 +1,8 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { ResultDetails } from '../models/ResultDetails'; import { Compiler } from '../libs/Compiler'; diff --git a/src/main/rules/UnconnectedElement.ts b/src/main/rules/UnconnectedElement.ts index 94e8f91..7e3ff74 100644 --- a/src/main/rules/UnconnectedElement.ts +++ b/src/main/rules/UnconnectedElement.ts @@ -1,9 +1,9 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { Flow } from '../models/Flow'; +import Flow from '../models/Flow'; import { FlowNode } from '../models/FlowNode'; import { FlowElement } from '../models/FlowElement'; import { FlowType } from '../models/FlowType'; -import { RuleResult } from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import { ResultDetails } from '../models/ResultDetails'; diff --git a/src/main/rules/UnusedVariable.ts b/src/main/rules/UnusedVariable.ts index 8408ae2..8968907 100644 --- a/src/main/rules/UnusedVariable.ts +++ b/src/main/rules/UnusedVariable.ts @@ -1,9 +1,9 @@ import {IRuleDefinition} from '../interfaces/IRuleDefinition'; -import {Flow} from '../models/Flow'; +import Flow from '../models/Flow'; import {FlowNode} from '../models/FlowNode'; import {FlowType} from '../models/FlowType'; import {FlowVariable} from '../models/FlowVariable'; -import {RuleResult} from '../models/RuleResult'; +import RuleResult from '../models/RuleResult'; import {RuleCommon} from '../models/RuleCommon'; import { ResultDetails } from '../models/ResultDetails'; diff --git a/tests/DMLPreventedByHidingNav.test.ts b/tests/DMLPreventedByHidingNav.test.ts index 56555e0..13d227d 100644 --- a/tests/DMLPreventedByHidingNav.test.ts +++ b/tests/DMLPreventedByHidingNav.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import Hidenav from './testfiles/hidenav.json'; describe('A screen flow with a DML statements between where the screen after the DML hides the navigation', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: Hidenav, }); @@ -27,7 +25,7 @@ describe('A screen flow with a DML statements between where the screen after the } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('DuplicateDMLOperation'); }); diff --git a/tests/DMLStatementInALoop_Demo.test.ts b/tests/DMLStatementInALoop_Demo.test.ts index 79953a6..8d53f69 100644 --- a/tests/DMLStatementInALoop_Demo.test.ts +++ b/tests/DMLStatementInALoop_Demo.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import dmlstatementsinaloop from './testfiles/DMLStatementInALoop_Demo.json'; describe('In the DMLStatementInALoop_Demo flow', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/DML_statements_in_a_loop.flow', xmldata: dmlstatementsinaloop, }); @@ -18,7 +16,7 @@ describe('In the DMLStatementInALoop_Demo flow', () => { it('there should be one result for the rule DMLStatementInLoop', () => { - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(1); expect(occurringResults[0].ruleName).to.equal("DMLStatementInLoop"); diff --git a/tests/DMLStatementInALoop_Demo_Fixed.test.ts b/tests/DMLStatementInALoop_Demo_Fixed.test.ts index a0da786..ee329a3 100644 --- a/tests/DMLStatementInALoop_Demo_Fixed.test.ts +++ b/tests/DMLStatementInALoop_Demo_Fixed.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import dmlstatementsinaloop from './testfiles/DMLStatementInALoop_Demo_Fixed.json'; describe('In the DMLStatementInALoop_Demo_Fixed flow', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/DML_statements_in_a_loop_fixed.flow', xmldata: dmlstatementsinaloop, }); @@ -18,7 +16,7 @@ describe('In the DMLStatementInALoop_Demo_Fixed flow', () => { it('there should be no result for the rule DMLStatementInLoop', () => { - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(0); }); diff --git a/tests/FlowNaming.test.ts b/tests/FlowNaming.test.ts index 896f48d..3d21c79 100644 --- a/tests/FlowNaming.test.ts +++ b/tests/FlowNaming.test.ts @@ -1,15 +1,13 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import Hidenav from './testfiles/hidenav.json'; describe('A flow with correct naming', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/CreateANewAccount.flow-meta.xml', xmldata: Hidenav, }); @@ -27,7 +25,7 @@ describe('A flow with correct naming', () => { } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('FlowName'); expect(results[0].ruleResults[0].occurs).to.equal(false); diff --git a/tests/FlowNamingException.test.ts b/tests/FlowNamingException.test.ts index 8de452d..0ca73bd 100644 --- a/tests/FlowNamingException.test.ts +++ b/tests/FlowNamingException.test.ts @@ -1,15 +1,13 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import Hidenav from './testfiles/hidenav.json'; describe('A flow with incorrect naming and set exception', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/AAAA.flow-meta.xml', xmldata: Hidenav, }); @@ -32,7 +30,7 @@ describe('A flow with incorrect naming and set exception', () => { } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('FlowName'); expect(results[0].ruleResults[0].occurs).to.equal(false); diff --git a/tests/FlowNamingTrue.test.ts b/tests/FlowNamingTrue.test.ts index 44d4c71..e9058d6 100644 --- a/tests/FlowNamingTrue.test.ts +++ b/tests/FlowNamingTrue.test.ts @@ -1,15 +1,13 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import Hidenav from './testfiles/hidenav.json'; describe('A flow with incorrect naming', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/****.flow-meta.xml', xmldata: Hidenav, }); @@ -27,7 +25,7 @@ describe('A flow with incorrect naming', () => { } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('FlowName'); expect(results[0].ruleResults[0].occurs).to.equal(true); diff --git a/tests/MissingNullHandler.test.ts b/tests/MissingNullHandler.test.ts index 5ffc1f1..ef98306 100644 --- a/tests/MissingNullHandler.test.ts +++ b/tests/MissingNullHandler.test.ts @@ -1,16 +1,15 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' + import CreateANewAccountWithChild from './testfiles/MissingNullHandler.json'; describe('When scanning a flow without null handlers', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/tc.flow-meta.xml', xmldata: CreateANewAccountWithChild, }); @@ -26,7 +25,7 @@ describe('When scanning a flow without null handlers', () => { }, } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults[0].ruleName).to.equal('MissingNullHandler') expect(results[0].ruleResults[0].occurs).to.equal(true); }); diff --git a/tests/MissingNullHandler_CV2.test.ts b/tests/MissingNullHandler_CV2.test.ts index 9cbef5b..4eac924 100644 --- a/tests/MissingNullHandler_CV2.test.ts +++ b/tests/MissingNullHandler_CV2.test.ts @@ -1,16 +1,15 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' + import CreateANewAccountWithChild from './testfiles/taskbs.json'; describe('When scanning a flow with custom variable assignments in queries that have null handlers', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/tc.flow-meta.xml', xmldata: CreateANewAccountWithChild, }); @@ -26,7 +25,7 @@ describe('When scanning a flow with custom variable assignments in queries that }, } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults[0].ruleName).to.equal('MissingNullHandler') expect(results[0].ruleResults[0].occurs).to.equal(true); }); diff --git a/tests/MissingNullHandler_CV3.test.ts b/tests/MissingNullHandler_CV3.test.ts index 8f5947e..13c744c 100644 --- a/tests/MissingNullHandler_CV3.test.ts +++ b/tests/MissingNullHandler_CV3.test.ts @@ -1,16 +1,15 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' + import CreateANewAccountWithChild from './testfiles/cv.json'; describe('aaaaaaaa', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/CreateANewAccountWithChild.flow-meta.xml', xmldata: CreateANewAccountWithChild, }); @@ -27,7 +26,7 @@ describe('aaaaaaaa', () => { } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('MissingNullHandler'); expect(results[0].ruleResults[0].occurs).to.equal(false); diff --git a/tests/MissingNullHandler_Fixed.test.ts b/tests/MissingNullHandler_Fixed.test.ts index 4632fc0..182a2de 100644 --- a/tests/MissingNullHandler_Fixed.test.ts +++ b/tests/MissingNullHandler_Fixed.test.ts @@ -1,16 +1,15 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' + import CreateANewAccountWithChild from './testfiles/MissingNullHandler_Fixed.json'; describe('When scanning a flow with null handlers', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/tc.flow-meta.xml', xmldata: CreateANewAccountWithChild, }); @@ -26,7 +25,7 @@ describe('When scanning a flow with null handlers', () => { }, } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults[0].ruleName).to.equal('MissingNullHandler') expect(results[0].ruleResults[0].occurs).to.equal(false); }); diff --git a/tests/SOQLQueryInALoop_Demo.test.ts b/tests/SOQLQueryInALoop_Demo.test.ts index e95c041..3f751f9 100644 --- a/tests/SOQLQueryInALoop_Demo.test.ts +++ b/tests/SOQLQueryInALoop_Demo.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import flowfile from './testfiles/SOQLQueryInALoop_Demo.json'; describe('In the SOQLQueryInALoop_Demo flow', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/SOQL_Query_In_Loop_Demo.flow', xmldata: flowfile, }); @@ -18,7 +16,7 @@ describe('In the SOQLQueryInALoop_Demo flow', () => { it('there should be one result for the rule SOQLQueryInLoop', () => { - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(1); expect(occurringResults[0].ruleName).to.equal("SOQLQueryInLoop"); diff --git a/tests/SOQLQueryInALoop_Demo_Fixed.test.ts b/tests/SOQLQueryInALoop_Demo_Fixed.test.ts index be1ce20..d5dff90 100644 --- a/tests/SOQLQueryInALoop_Demo_Fixed.test.ts +++ b/tests/SOQLQueryInALoop_Demo_Fixed.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import flowfile from './testfiles/SOQLQueryInALoop_Demo_Fixed.json'; describe('In the SOQLQueryInALoop_Demo flow', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/SOQL_Query_In_Loop_Demo.flow', xmldata: flowfile, }); @@ -18,7 +16,7 @@ describe('In the SOQLQueryInALoop_Demo flow', () => { it('there should be no result for the rule SOQLQueryInLoop', () => { - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(0); }); diff --git a/tests/UnconnectedElement.test.ts b/tests/UnconnectedElement.test.ts index 4eee8ce..7efd9be 100644 --- a/tests/UnconnectedElement.test.ts +++ b/tests/UnconnectedElement.test.ts @@ -1,42 +1,40 @@ import { expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import unconnectedElement from './testfiles/UnconnectedElement.json'; import asyncAfterCommitOnly from './testfiles/AsyncAfterCommitOnly.json'; import waitForOnly from './testfiles/WaitForOnly.json'; describe('In the unconnected element flow', () => { - let flow: Flow; + let flow: core.Flow; it('there should be consideration for async elements', () => { - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/Async_AfterCommitOnly.flow', xmldata: asyncAfterCommitOnly, }); - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(0); }); it('there should consideration for async wait paths', () => { - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/Async_AfterCommitOnly.flow', xmldata: waitForOnly, }); - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(0); }); it('there should be checks for unconnected element', () => { - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/Async_AfterCommitOnly.flow', xmldata: unconnectedElement, }); - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(1); expect(occurringResults[0].ruleName).to.equal("UnconnectedElement"); diff --git a/tests/copyOfFalseTest.test.ts b/tests/copyOfFalseTest.test.ts index dfed24d..04bb960 100644 --- a/tests/copyOfFalseTest.test.ts +++ b/tests/copyOfFalseTest.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import CreateANewAccountWithChild from './testfiles/CreateANewAccountWithChild.json'; describe('In a normal flow without copied elements', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: CreateANewAccountWithChild, }); @@ -26,7 +24,7 @@ describe('In a normal flow without copied elements', () => { }, }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('CopyAPIName'); diff --git a/tests/copyOfTrueTest.test.ts b/tests/copyOfTrueTest.test.ts index ed609d8..25f0cfd 100644 --- a/tests/copyOfTrueTest.test.ts +++ b/tests/copyOfTrueTest.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import CreateANewAccountWithChild from './testfiles/CreateANewAccountWithCopy.json'; describe('In a normal flow without copied elements', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: CreateANewAccountWithChild, }); @@ -26,7 +24,7 @@ describe('In a normal flow without copied elements', () => { }, }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('CopyAPIName'); diff --git a/tests/demo_flowNamingConvention.test.ts b/tests/demo_flowNamingConvention.test.ts index cb07c01..3f03349 100644 --- a/tests/demo_flowNamingConvention.test.ts +++ b/tests/demo_flowNamingConvention.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import FlowNamingConvention from './testfiles/FlowNamingConvention_Demo.json'; describe('In the FlowNamingConvention flow', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/FlowNamingConvention.flow', xmldata: FlowNamingConvention, }); @@ -18,7 +16,7 @@ describe('In the FlowNamingConvention flow', () => { it('there should be one result for the rule FlowName', () => { - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(1); expect(occurringResults[0].ruleName).to.equal("FlowName"); diff --git a/tests/demo_hardcodedId.test.ts b/tests/demo_hardcodedId.test.ts index 6cd4574..bda21ce 100644 --- a/tests/demo_hardcodedId.test.ts +++ b/tests/demo_hardcodedId.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import hardcodedids from './testfiles/HardcodedID_Demo.json'; describe('In the Hardcoded_Ids flow', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/Hardcoded_Ids.flow', xmldata: hardcodedids, }); @@ -18,7 +16,7 @@ describe('In the Hardcoded_Ids flow', () => { it('there should be one result for the rule HardcodedIds', () => { - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(1); expect(occurringResults[0].ruleName).to.equal("HardcodedId"); diff --git a/tests/demo_missingFaultPath.test.ts b/tests/demo_missingFaultPath.test.ts index 56b9201..85d2dc3 100644 --- a/tests/demo_missingFaultPath.test.ts +++ b/tests/demo_missingFaultPath.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import missingerrorhandler from './testfiles/missingerrorhandler.json'; describe('In the Missing_error_handlers flow', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/Missing_error_handlers.flow-meta.flow', xmldata: missingerrorhandler, }); @@ -18,7 +16,7 @@ describe('In the Missing_error_handlers flow', () => { it('there should be one result for the rule MissingFaultPath', () => { - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(1); expect(occurringResults[0].ruleName).to.equal("MissingFaultPath"); diff --git a/tests/demo_missingFaultPathFixed.test.ts b/tests/demo_missingFaultPathFixed.test.ts index 767172f..8b194cf 100644 --- a/tests/demo_missingFaultPathFixed.test.ts +++ b/tests/demo_missingFaultPathFixed.test.ts @@ -1,23 +1,21 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import missingerrorhandler from './testfiles/missingerrorhandler_fixed.json'; describe('Demo Flow Missing_Error_Handler_Fixed', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/Missing_Error_Handler_Fixed.flow-meta.flow', xmldata: missingerrorhandler, }); }); it('Should have no result', () => { - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(0); }); diff --git a/tests/demo_missingFlowDescription.test.ts b/tests/demo_missingFlowDescription.test.ts index 4d6a965..9b489c3 100644 --- a/tests/demo_missingFlowDescription.test.ts +++ b/tests/demo_missingFlowDescription.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import missingFlowDescription from './testfiles/MissingFlowDescription_Demo.json'; describe('In the Missing_Flow_Description flow', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/Missing_Flow_Description.flow', xmldata: missingFlowDescription, }); @@ -18,7 +16,7 @@ describe('In the Missing_Flow_Description flow', () => { it('there should be one result for the rule FlowDescription', () => { - const results: ScanResult[] = scan([flow]); + const results: core.ScanResult[] = core.scan([flow]); const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); expect(occurringResults.length).to.equal(1); expect(occurringResults[0].ruleName).to.equal("FlowDescription"); diff --git a/tests/duplicateDMLOperationsByNav_exception.test.ts b/tests/duplicateDMLOperationsByNav_exception.test.ts index cb8a96b..e7496c6 100644 --- a/tests/duplicateDMLOperationsByNav_exception.test.ts +++ b/tests/duplicateDMLOperationsByNav_exception.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import CreateANewAccountWithChild from './testfiles/CreateANewAccountWithChild.json'; describe('When scanning a screen flow with 2 DML statements between screens and one marked as exception', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/CreateANewAccountWithChild.flow-meta.xml', xmldata: CreateANewAccountWithChild, }); @@ -32,7 +30,7 @@ describe('When scanning a screen flow with 2 DML statements between screens and } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('DuplicateDMLOperation'); expect(results[0].ruleResults[0].details.length).to.equal(1); }); diff --git a/tests/duplicateDMLOperationsByNav_exceptiontwo.test.ts b/tests/duplicateDMLOperationsByNav_exceptiontwo.test.ts index 249d416..478a985 100644 --- a/tests/duplicateDMLOperationsByNav_exceptiontwo.test.ts +++ b/tests/duplicateDMLOperationsByNav_exceptiontwo.test.ts @@ -1,16 +1,15 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' + import CreateANewAccountWithChild from './testfiles/CreateANewAccountWithChild.json'; describe('strange', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/CreateANewAccountWithChild.flow-meta.xml', xmldata: CreateANewAccountWithChild, }); @@ -37,7 +36,7 @@ describe('strange', () => { } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); const ruleResult = results[0].ruleResults.find( (result) => result.ruleName === 'DuplicateDMLOperation' ); diff --git a/tests/duplicateDMLOperationsByNavigation_0InScreenFlow.test.ts b/tests/duplicateDMLOperationsByNavigation_0InScreenFlow.test.ts index becd336..f12ef07 100644 --- a/tests/duplicateDMLOperationsByNavigation_0InScreenFlow.test.ts +++ b/tests/duplicateDMLOperationsByNavigation_0InScreenFlow.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import CreateANewAccountImproved from './testfiles/CreateANewAccountImproved.json'; describe('When scanning a screen flow with 2 screens, a DML statement in between, and correct limits in navigation of the later screen', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: CreateANewAccountImproved, }); @@ -26,7 +24,7 @@ describe('When scanning a screen flow with 2 screens, a DML statement in between }, }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('DuplicateDMLOperation'); diff --git a/tests/duplicateDMLOperationsByNavigation_1InScreenFlow.test.ts b/tests/duplicateDMLOperationsByNavigation_1InScreenFlow.test.ts index 7c45a5b..0a05f80 100644 --- a/tests/duplicateDMLOperationsByNavigation_1InScreenFlow.test.ts +++ b/tests/duplicateDMLOperationsByNavigation_1InScreenFlow.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import createANewAccount from './testfiles/CreateANewAccount.json'; describe('When scanning a screen flow with 2 screens, one DML statement in between, and no limits to navigation', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: createANewAccount, }); @@ -26,7 +24,7 @@ describe('When scanning a screen flow with 2 screens, one DML statement in betwe }, }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('DuplicateDMLOperation'); diff --git a/tests/duplicateDMLOperationsByNavigation_1UnconnectedInScreenFlow.test.ts b/tests/duplicateDMLOperationsByNavigation_1UnconnectedInScreenFlow.test.ts index 847a8b7..427ae54 100644 --- a/tests/duplicateDMLOperationsByNavigation_1UnconnectedInScreenFlow.test.ts +++ b/tests/duplicateDMLOperationsByNavigation_1UnconnectedInScreenFlow.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import UnconnectedScreensWithDuplicateDML from './testfiles/UnconnectedScreensWithDuplicateDML.json'; describe('When scanning a screen flow with 2 screens, a DML statement in between, and limits in navigation of the later screen', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: UnconnectedScreensWithDuplicateDML, }); @@ -26,7 +24,7 @@ describe('When scanning a screen flow with 2 screens, a DML statement in between }, }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('DuplicateDMLOperation'); diff --git a/tests/duplicateDMLOperationsByNavigation_2InScreenFlow.test.ts b/tests/duplicateDMLOperationsByNavigation_2InScreenFlow.test.ts index 7f5f758..df8dd69 100644 --- a/tests/duplicateDMLOperationsByNavigation_2InScreenFlow.test.ts +++ b/tests/duplicateDMLOperationsByNavigation_2InScreenFlow.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import CreateANewAccountWithChild from './testfiles/CreateANewAccountWithChild.json'; describe('When scanning a screen flow with 2 screens, a DML statement in between, and no limits to navigation', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: CreateANewAccountWithChild, }); @@ -26,7 +24,7 @@ describe('When scanning a screen flow with 2 screens, a DML statement in between }, }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('DuplicateDMLOperation'); diff --git a/tests/duplicateDMLOperationsByNavigation_NoResult.test.ts b/tests/duplicateDMLOperationsByNavigation_NoResult.test.ts index 0eb8393..8c60468 100644 --- a/tests/duplicateDMLOperationsByNavigation_NoResult.test.ts +++ b/tests/duplicateDMLOperationsByNavigation_NoResult.test.ts @@ -1,16 +1,15 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; + import AssignTaskOwner from './testfiles/AssignTaskOwner.json'; describe('When scanning a screen flow with 2 screens, a DML statement in between, and limits in navigation of the later screen', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: AssignTaskOwner, }); @@ -26,7 +25,7 @@ describe('When scanning a screen flow with 2 screens, a DML statement in between }, }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(0); }); diff --git a/tests/flowAPIVersion_AboveDFTH.test.ts b/tests/flowAPIVersion_AboveDFTH.test.ts index 8a520a8..134a8ce 100644 --- a/tests/flowAPIVersion_AboveDFTH.test.ts +++ b/tests/flowAPIVersion_AboveDFTH.test.ts @@ -1,15 +1,13 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import Hidenav from './testfiles/api58test.json'; describe('A flow with the API version attribute', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/api58test.flow-meta.xml', xmldata: Hidenav, }); @@ -26,7 +24,7 @@ describe('A flow with the API version attribute', () => { } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('APIVersion'); expect(results[0].ruleResults[0].occurs).to.equal(false); diff --git a/tests/flowAPIVersion_BelowTH.test.ts b/tests/flowAPIVersion_BelowTH.test.ts index 1f3f400..85691ad 100644 --- a/tests/flowAPIVersion_BelowTH.test.ts +++ b/tests/flowAPIVersion_BelowTH.test.ts @@ -1,15 +1,13 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import Hidenav from './testfiles/api58test.json'; describe('A flow with the API version attribute below the configured threshold', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/api58test.flow-meta.xml', xmldata: Hidenav, }); @@ -27,7 +25,7 @@ describe('A flow with the API version attribute below the configured threshold', } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('APIVersion'); expect(results[0].ruleResults[0].occurs).to.equal(true); diff --git a/tests/flowAPIVersion_Missing.test.ts b/tests/flowAPIVersion_Missing.test.ts index 7f923cb..f18743f 100644 --- a/tests/flowAPIVersion_Missing.test.ts +++ b/tests/flowAPIVersion_Missing.test.ts @@ -1,15 +1,13 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import Hidenav from './testfiles/hidenav.json'; describe('A flow without the API version attribute', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/CreateANewAccount.flow-meta.xml', xmldata: Hidenav, }); @@ -26,7 +24,7 @@ describe('A flow without the API version attribute', () => { } }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('APIVersion'); expect(results[0].ruleResults[0].occurs).to.equal(true); diff --git a/tests/getRules_findsAll.test.ts b/tests/getRules_findsAll.test.ts index b175e17..a0a32ce 100644 --- a/tests/getRules_findsAll.test.ts +++ b/tests/getRules_findsAll.test.ts @@ -1,10 +1,10 @@ -import {getRules} from '../src'; +import * as core from '../src' import { expect } from 'chai'; import 'mocha'; describe('GetRuleDefinitions function', () => { it('should return 12 rules', () => { - const result = getRules(); + const result = core.getRules(); expect(result.length).to.equal(12); }); }); diff --git a/tests/missingFlowDescription_false.test.ts b/tests/missingFlowDescription_false.test.ts index e3f1686..fbbe319 100644 --- a/tests/missingFlowDescription_false.test.ts +++ b/tests/missingFlowDescription_false.test.ts @@ -1,16 +1,15 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' + import CreateANewAccount from './testfiles/CreateANewAccount.json'; describe('When scanning a flow with description', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: CreateANewAccount, }); @@ -26,7 +25,7 @@ describe('When scanning a flow with description', () => { }, }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('FlowDescription'); diff --git a/tests/missingFlowDescription_true.test.ts b/tests/missingFlowDescription_true.test.ts index c880c07..7af958a 100644 --- a/tests/missingFlowDescription_true.test.ts +++ b/tests/missingFlowDescription_true.test.ts @@ -1,16 +1,15 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' + import CreateANewAccountImproved from './testfiles/CreateANewAccountImproved.json'; describe('When scanning a flow without description', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: CreateANewAccountImproved, }); @@ -26,7 +25,7 @@ describe('When scanning a flow without description', () => { }, }; - const results: ScanResult[] = scan([flow], ruleConfig); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].ruleName).to.equal('FlowDescription'); diff --git a/tests/multipleRulesAndFlows.test.ts b/tests/multipleRulesAndFlows.test.ts index aebf9c6..f7bd370 100644 --- a/tests/multipleRulesAndFlows.test.ts +++ b/tests/multipleRulesAndFlows.test.ts @@ -1,23 +1,21 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import CreateANewAccountWithChild from './testfiles/CreateANewAccountWithChild.json'; import CreateANewAccountImproved from './testfiles/CreateANewAccountImproved.json'; describe('When scanning multiple flows', () => { - let flow: Flow; - let flow2: Flow; - let flows: Flow[]; + let flow: core.Flow; + let flow2: core.Flow; + let flows: core.Flow[]; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: CreateANewAccountWithChild, }); - flow2 = new Flow({ + flow2 = new core.Flow({ path: 'anypath2', xmldata: CreateANewAccountImproved, }); @@ -50,7 +48,7 @@ describe('When scanning multiple flows', () => { { "UnusedVariable": ["createAccount2"] } } }; - const results: ScanResult[] = scan(flows, ruleConfig); + const results: core.ScanResult[] = core.scan(flows, ruleConfig); expect(results.length).to.equal(2); }); }); diff --git a/tests/noRulesProvided.test.ts b/tests/noRulesProvided.test.ts index 68d718d..82ad2d3 100644 --- a/tests/noRulesProvided.test.ts +++ b/tests/noRulesProvided.test.ts @@ -1,17 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { scan, getRules } from '../src'; - -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src'; import CreateANewAccount from './testfiles/CreateANewAccount.json'; describe('When running with empty rule config', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: 'anypath', xmldata: CreateANewAccount, }); @@ -19,8 +16,8 @@ describe('When running with empty rule config', () => { it('all default rules should be used', () => { - const results: ScanResult[] = scan([flow], undefined); - const rules = getRules(); + const results: core.ScanResult[] = core.scan([flow], undefined); + const rules = core.getRules(); expect(results[0].ruleResults.length).to.equal(rules.length); }); }); diff --git a/tests/noRulesProvided2.test.ts b/tests/noRulesProvided2.test.ts index 5fc3996..78c4076 100644 --- a/tests/noRulesProvided2.test.ts +++ b/tests/noRulesProvided2.test.ts @@ -1,16 +1,14 @@ import { assert, expect } from 'chai'; import 'mocha'; -import { getRules, scan } from '../src'; -import { Flow } from '../src/main/models/Flow'; -import { ScanResult } from '../src/main/models/ScanResult'; +import * as core from '../src' import CreateANewAccount from './testfiles/CreateANewAccount.json'; describe('When running with empty object rules in the rule config', () => { - let flow: Flow; + let flow: core.Flow; before('arrange', () => { // ARRANGE - flow = new Flow({ + flow = new core.Flow({ path: './testfiles/CreateANewAccountWithChild.flow-meta.xml', xmldata: CreateANewAccount, }); @@ -30,8 +28,8 @@ describe('When running with empty object rules in the rule config', () => { {"DuplicateDMLOperation":["ViewAccountId"]} } }; - const results: ScanResult[] = scan([flow], ruleConfig); - const rules = getRules(); + const results: core.ScanResult[] = core.scan([flow], ruleConfig); + const rules = core.getRules(); expect(results[0].ruleResults.length).to.equal(rules.length); }); }); From 4df944f23c04838a3bde5a8d8638b47ed59af12c Mon Sep 17 00:00:00 2001 From: Ruben Date: Thu, 29 Feb 2024 21:10:55 +0100 Subject: [PATCH 02/15] init cr --- src/main/interfaces/IRuleConfig.ts | 3 +- src/main/interfaces/IRuleDefinition.ts | 2 +- src/main/libs/GetRuleDefinitions.ts | 33 ++++++++++------ src/main/libs/RuleLoader.ts | 8 ++++ src/main/libs/RuleParser.ts | 55 ++++++++++++++++++++++++++ src/main/models/RuleCommon.ts | 2 +- tests/CustomRuleTest.test.ts | 38 ++++++++++++++++++ 7 files changed, 125 insertions(+), 16 deletions(-) create mode 100644 src/main/libs/RuleLoader.ts create mode 100644 src/main/libs/RuleParser.ts create mode 100644 tests/CustomRuleTest.test.ts diff --git a/src/main/interfaces/IRuleConfig.ts b/src/main/interfaces/IRuleConfig.ts index 257430b..6bfd32b 100644 --- a/src/main/interfaces/IRuleConfig.ts +++ b/src/main/interfaces/IRuleConfig.ts @@ -1,3 +1,4 @@ export interface IRuleConfig { - severity: string; + severity?: string; + path?: string; } \ No newline at end of file diff --git a/src/main/interfaces/IRuleDefinition.ts b/src/main/interfaces/IRuleDefinition.ts index 704ddc7..3015138 100644 --- a/src/main/interfaces/IRuleDefinition.ts +++ b/src/main/interfaces/IRuleDefinition.ts @@ -2,7 +2,6 @@ import Flow from '../models/Flow'; import RuleResult from '../models/RuleResult'; export interface IRuleDefinition { - uri: string; name: string; label: string; description: string; @@ -10,6 +9,7 @@ export interface IRuleDefinition { type: string; docRefs: { label: string, path: string }[]; isConfigurable: boolean; + uri?: string; severity?: string; execute(flow: Flow, ruleOptions?: {}): RuleResult; diff --git a/src/main/libs/GetRuleDefinitions.ts b/src/main/libs/GetRuleDefinitions.ts index d7dc2ee..dec1fd7 100644 --- a/src/main/libs/GetRuleDefinitions.ts +++ b/src/main/libs/GetRuleDefinitions.ts @@ -1,21 +1,28 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { DefaultRuleStore } from '../store/DefaultRuleStore'; import { DynamicRule } from './DynamicRule'; +import { RuleLoader } from './RuleLoader'; export function GetRuleDefinitions(ruleConfig?: Map): IRuleDefinition[] { - const matchedRules: any[] = []; - let severity = 'error'; - + const selectedRules: any[] = []; if (ruleConfig && ruleConfig instanceof Map) { for (const ruleName of ruleConfig.keys()) { - try{ - const matchedRule = new DynamicRule(ruleName); - const configuredSeverity = ruleConfig.get(ruleName)['severity']; - if (configuredSeverity && (configuredSeverity === "error" || configuredSeverity === "warning" || configuredSeverity === "note")) { - severity = configuredSeverity; - } + let severity = 'error'; + try { + const configuredPath = ruleConfig.get(ruleName)['path'] + const configuredSeverity = ruleConfig.get(ruleName)['severity']; + if (configuredSeverity && (configuredSeverity === "error" || configuredSeverity === "warning" || configuredSeverity === "note")) { + severity = configuredSeverity; + } + if(configuredPath){ + let customRule = RuleLoader.loadCustomRule(configuredPath); + selectedRules['severity'] = severity; + selectedRules.push(customRule); + } else { + const matchedRule = new DynamicRule(ruleName); matchedRule['severity'] = severity; - matchedRules.push(matchedRule); + selectedRules.push(matchedRule); + } } catch (error) { console.log(error.message) } @@ -24,10 +31,10 @@ export function GetRuleDefinitions(ruleConfig?: Map): IRuleDefinitio // tslint:disable-next-line:forin for (const rule in DefaultRuleStore) { const matchedRule = new DynamicRule(rule); - matchedRule['severity'] = severity; - matchedRules.push(matchedRule); + matchedRule['severity'] = 'error'; + selectedRules.push(matchedRule); } } - return matchedRules; + return selectedRules; } diff --git a/src/main/libs/RuleLoader.ts b/src/main/libs/RuleLoader.ts new file mode 100644 index 0000000..e45dc5f --- /dev/null +++ b/src/main/libs/RuleLoader.ts @@ -0,0 +1,8 @@ +import { IRuleDefinition } from "../interfaces/IRuleDefinition"; +import { RuleParser } from "./RuleParser"; + +export class RuleLoader { + static loadCustomRule(filePath: string): IRuleDefinition | undefined { + return RuleParser.parseRuleFile(filePath); + } +} diff --git a/src/main/libs/RuleParser.ts b/src/main/libs/RuleParser.ts new file mode 100644 index 0000000..43b4b4b --- /dev/null +++ b/src/main/libs/RuleParser.ts @@ -0,0 +1,55 @@ +import * as ts from 'typescript'; +import * as fs from 'fs'; +import { IRuleDefinition } from '../interfaces/IRuleDefinition'; + +export class RuleParser { + static parseRuleFile(filePath: string): IRuleDefinition | undefined { + const fileContent = fs.readFileSync(filePath, 'utf-8'); + const sourceFile = ts.createSourceFile( + filePath, + fileContent, + ts.ScriptTarget.ESNext + ); + + let ruleDefinition: IRuleDefinition | undefined; + + function visit(node: ts.Node) { + if (ts.isClassDeclaration(node)) { + const className = node.name?.escapedText; + if (className) { + const methods = node.members.filter(member => + ts.isMethodDeclaration(member) + ) as ts.MethodDeclaration[]; + const requiredMethods = ['execute']; + const methodNames = methods.map(method => method.name?.['escapedText']); + const implementsMethods = requiredMethods.every(methodName => + methods.some(method => + methodNames.includes(methodName) + ) + ); + const properties = node.members.filter(member => + ts.isPropertyDeclaration(member) + ) as ts.PropertyDeclaration[]; + const requiredProperties = ['name', 'label', 'description', 'supportedTypes', 'type', 'docRefs', 'isConfigurable']; + const propertyNames = properties.map(property => property.name?.['escapedText']); + const implementsProperties = requiredProperties.every(propertyName => + propertyNames.includes(propertyName) + ); + if (implementsMethods) { + ruleDefinition = RuleParser.extractRuleDefinition(node); + } + } + } + ts.forEachChild(node, visit); + } + + ts.forEachChild(sourceFile, visit); + return ruleDefinition; + } + + private static extractRuleDefinition(classDeclaration: ts.ClassDeclaration): IRuleDefinition { + // Extract relevant information from the class declaration + // and create an instance of IRuleDefinition + return null; + } +} diff --git a/src/main/models/RuleCommon.ts b/src/main/models/RuleCommon.ts index d420447..d6aa75d 100644 --- a/src/main/models/RuleCommon.ts +++ b/src/main/models/RuleCommon.ts @@ -23,7 +23,7 @@ export class RuleCommon { this.supportedTypes = info.supportedTypes; this.label = info.label; this.description = info.description; - this.uri = 'https://github.com/Force-Config-Control/lightning-flow-scanner-core/tree/master/src/main/rules/' + info.name + '.ts'; + this.uri = 'https://github.com/Lightning-Flow-Scanner/lightning-flow-scanner-core/tree/master/src/main/rules/' + info.name + '.ts'; this.docRefs = info.docRefs; this.isConfigurable = info.isConfigurable; this.severity = (optional && optional.severity) ? optional.severity : 'error'; diff --git a/tests/CustomRuleTest.test.ts b/tests/CustomRuleTest.test.ts new file mode 100644 index 0000000..d9afd68 --- /dev/null +++ b/tests/CustomRuleTest.test.ts @@ -0,0 +1,38 @@ +import { assert, expect } from 'chai'; +import 'mocha'; +import * as core from '../src' +import Hidenav from './testfiles/hidenav.json'; + +describe('With a custom rule', () => { + let flow: core.Flow; + + before('arrange', () => { + flow = new core.Flow({ + path: './testfiles/****.flow-meta.xml', + xmldata: Hidenav, + }); + }); + + it(' should have a result', () => { + const ruleConfig = { + rules: + { + FlowName: + { + severity: 'error', + expression: '[A-Za-z0-9]' + }, + FlowName2: + { + severity: 'error', + path: '/Users/rubenhalman/Desktop/FlowName2.ts' + } + } + }; + + const results: core.ScanResult[] = core.scan([flow], ruleConfig); + expect(results[0].ruleResults.length).to.equal(2); + expect(results[0].ruleResults[0].occurs).to.equal(true); + expect(results[0].ruleResults[1].occurs).to.equal(true); + }); +}); From 78d5408378de709dca5e154fa4bcaa3841fc1c1b Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 1 Mar 2024 16:18:05 +0100 Subject: [PATCH 03/15] epose flownode --- src/index.ts | 1 + src/main/libs/Compiler.ts | 2 +- src/main/libs/FixFlows.ts | 3 +-- src/main/models/Flow.ts | 2 +- src/main/models/FlowNode.ts | 2 +- src/main/models/ResultDetails.ts | 2 +- src/main/rules/CopyAPIName.ts | 3 +-- src/main/rules/DMLStatementInLoop.ts | 5 ++--- src/main/rules/DuplicateDMLOperation.ts | 7 +++---- src/main/rules/MissingFaultPath.ts | 9 ++++----- src/main/rules/MissingNullHandler.ts | 5 ++--- src/main/rules/SOQLQueryInLoop.ts | 5 ++--- src/main/rules/UnconnectedElement.ts | 3 +-- src/main/rules/UnusedVariable.ts | 3 +-- 14 files changed, 22 insertions(+), 30 deletions(-) diff --git a/src/index.ts b/src/index.ts index 98dbf2e..4e71b96 100644 --- a/src/index.ts +++ b/src/index.ts @@ -56,6 +56,7 @@ export function fix(flows: Flow[]): ScanResult[] { } export { default as Flow } from './main/models/Flow'; +export { default as FlowNode } from './main/models/FlowNode'; export { default as ScanResult } from './main/models/ScanResult'; export { default as RuleResult } from './main/models/RuleResult'; export { default as ResultDetails } from './main/models/ResultDetails'; \ No newline at end of file diff --git a/src/main/libs/Compiler.ts b/src/main/libs/Compiler.ts index 538eb65..1a8cd9f 100644 --- a/src/main/libs/Compiler.ts +++ b/src/main/libs/Compiler.ts @@ -1,5 +1,5 @@ import Flow from '../models/Flow'; -import { FlowNode } from '../models/FlowNode'; +import FlowNode from '../models/FlowNode'; export class Compiler { private visitedElements: Set; diff --git a/src/main/libs/FixFlows.ts b/src/main/libs/FixFlows.ts index ef3131a..aa4baa7 100644 --- a/src/main/libs/FixFlows.ts +++ b/src/main/libs/FixFlows.ts @@ -1,4 +1,3 @@ -import { FlowNode } from '../models/FlowNode'; import { FlowVariable } from '../models/FlowVariable'; import { UnconnectedElement } from '../rules/UnconnectedElement'; import { UnusedVariable } from '../rules/UnusedVariable'; @@ -23,7 +22,7 @@ export function FixFlows(flows: core.Flow[]): core.ScanResult[] { } break; case 'node': - const nodeElement = node as FlowNode; + const nodeElement = node as core.FlowNode; if (!unconnectedElementsReferences.includes(nodeElement.name)) { return node; } diff --git a/src/main/models/Flow.ts b/src/main/models/Flow.ts index 1d3ab1d..7f8197b 100644 --- a/src/main/models/Flow.ts +++ b/src/main/models/Flow.ts @@ -1,4 +1,4 @@ -import { FlowNode } from './FlowNode'; +import FlowNode from './FlowNode'; import { FlowMetadata } from './FlowMetadata'; import { FlowElement } from './FlowElement'; import { FlowVariable } from './FlowVariable'; diff --git a/src/main/models/FlowNode.ts b/src/main/models/FlowNode.ts index 1ac5a53..57ced6d 100644 --- a/src/main/models/FlowNode.ts +++ b/src/main/models/FlowNode.ts @@ -1,7 +1,7 @@ import { FlowElementConnector } from './FlowElementConnector'; import { FlowElement } from './FlowElement'; -export class FlowNode extends FlowElement { +export default class FlowNode extends FlowElement { public connectors: FlowElementConnector[] = []; public name: string; diff --git a/src/main/models/ResultDetails.ts b/src/main/models/ResultDetails.ts index e099162..d545c00 100644 --- a/src/main/models/ResultDetails.ts +++ b/src/main/models/ResultDetails.ts @@ -1,5 +1,5 @@ import { FlowAttribute } from "./FlowAttribute"; -import { FlowNode } from "./FlowNode"; +import FlowNode from "./FlowNode"; import { FlowVariable } from "./FlowVariable"; export default class ResultDetails { diff --git a/src/main/rules/CopyAPIName.ts b/src/main/rules/CopyAPIName.ts index f0a86fb..cbf85c0 100644 --- a/src/main/rules/CopyAPIName.ts +++ b/src/main/rules/CopyAPIName.ts @@ -2,7 +2,6 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import * as core from '../../index'; import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; -import { FlowNode } from '../models/FlowNode'; export class CopyAPIName extends RuleCommon implements IRuleDefinition { @@ -21,7 +20,7 @@ export class CopyAPIName extends RuleCommon implements IRuleDefinition { public execute(flow: core.Flow): core.RuleResult { - const flowElements: FlowNode[] = flow.elements.filter(node => node instanceof FlowNode) as FlowNode[]; + const flowElements: core.FlowNode[] = flow.elements.filter(node => node instanceof core.FlowNode) as core.FlowNode[]; const copyOfElements = []; for (const element of flowElements) { const copyOf = new RegExp('Copy_[0-9]+_of_[A-Za-z0-9]+').test(element.name); diff --git a/src/main/rules/DMLStatementInLoop.ts b/src/main/rules/DMLStatementInLoop.ts index d294c4f..d27d1c6 100644 --- a/src/main/rules/DMLStatementInLoop.ts +++ b/src/main/rules/DMLStatementInLoop.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import { Compiler } from '../libs/Compiler'; @@ -25,8 +24,8 @@ export class DMLStatementInLoop extends RuleCommon implements IRuleDefinition { } const dmlStatementTypes = ['recordDeletes', 'recordUpdates', 'recordCreates']; - const loopElements: FlowNode[] = flow.elements.filter(node => node.subtype === 'loops') as FlowNode[]; - const dmlStatementsInLoops: FlowNode[] = []; + const loopElements: core.FlowNode[] = flow.elements.filter(node => node.subtype === 'loops') as core.FlowNode[]; + const dmlStatementsInLoops: core.FlowNode[] = []; const compiler = new Compiler(); // Check if a DML statement is inside a loop diff --git a/src/main/rules/DuplicateDMLOperation.ts b/src/main/rules/DuplicateDMLOperation.ts index f304c09..defd006 100644 --- a/src/main/rules/DuplicateDMLOperation.ts +++ b/src/main/rules/DuplicateDMLOperation.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; @@ -22,10 +21,10 @@ export class DuplicateDMLOperation extends RuleCommon implements IRuleDefinition if (flow.type[0] === 'Survey') { return new core.RuleResult(this, []); } - const flowElements: FlowNode[] = flow.elements.filter(node => node instanceof FlowNode) as FlowNode[]; + const flowElements: core.FlowNode[] = flow.elements.filter(node => node instanceof core.FlowNode) as core.FlowNode[]; const processedElementIndexes: number[] = []; const unconnectedElementIndexes: number[] = []; - const DuplicateDMLOperations: FlowNode[] = []; + const DuplicateDMLOperations: core.FlowNode[] = []; const startingNode = this.findStart(flow); if (!startingNode || startingNode === -1) { throw 'Can not find starting element'; @@ -92,7 +91,7 @@ export class DuplicateDMLOperation extends RuleCommon implements IRuleDefinition } private findStart(flow: core.Flow) { - const flowElements: FlowNode[] = flow.elements.filter(node => node instanceof FlowNode) as FlowNode[]; + const flowElements: core.FlowNode[] = flow.elements.filter(node => node instanceof core.FlowNode) as core.FlowNode[]; let start; if (flow.startElementReference) { start = flowElements.findIndex(n => { diff --git a/src/main/rules/MissingFaultPath.ts b/src/main/rules/MissingFaultPath.ts index 8ff2b9b..aaea27a 100644 --- a/src/main/rules/MissingFaultPath.ts +++ b/src/main/rules/MissingFaultPath.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import { Compiler } from '../libs/Compiler'; @@ -25,9 +24,9 @@ export class MissingFaultPath extends RuleCommon implements IRuleDefinition { const compiler = new Compiler(); const results: core.ResultDetails[] = []; - const elementsWhereFaultPathIsApplicable = (flow.elements.filter((node) => node instanceof FlowNode && ['recordLookups', 'recordDeletes', 'recordUpdates', 'recordCreates', 'waits', 'actionCalls'].includes(node.subtype)) as FlowNode[]).map((e) => e.name); + const elementsWhereFaultPathIsApplicable = (flow.elements.filter((node) => node instanceof core.FlowNode && ['recordLookups', 'recordDeletes', 'recordUpdates', 'recordCreates', 'waits', 'actionCalls'].includes(node.subtype)) as core.FlowNode[]).map((e) => e.name); - const visitCallback = (element: FlowNode) => { + const visitCallback = (element: core.FlowNode) => { // Check if the element should have a fault path if (!element.connectors.find((connector) => connector.type === 'faultConnector') && elementsWhereFaultPathIsApplicable.includes(element.name)) { // Check if the element is part of another fault path @@ -43,8 +42,8 @@ export class MissingFaultPath extends RuleCommon implements IRuleDefinition { return new core.RuleResult(this, results); } - private isPartOfFaultHandlingFlow(element: FlowNode, flow: core.Flow): boolean { - const flowelements = flow.elements.filter(el => el instanceof FlowNode) as FlowNode[]; + private isPartOfFaultHandlingFlow(element: core.FlowNode, flow: core.Flow): boolean { + const flowelements = flow.elements.filter(el => el instanceof core.FlowNode) as core.FlowNode[]; for (const otherElement of flowelements) { if (otherElement !== element) { // Check if the otherElement has a faultConnector pointing to element diff --git a/src/main/rules/MissingNullHandler.ts b/src/main/rules/MissingNullHandler.ts index 535c41c..1827760 100644 --- a/src/main/rules/MissingNullHandler.ts +++ b/src/main/rules/MissingNullHandler.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; @@ -24,8 +23,8 @@ export class MissingNullHandler extends RuleCommon implements IRuleDefinition { return new RuleResult(this, []); } const getOperations = ['recordLookups']; - const getOperationElements: FlowNode[] = flow.elements.filter(node => node.metaType === 'node' && getOperations.includes(node.subtype)) as FlowNode[]; - const decisionElements: FlowNode[] = flow.elements.filter(node => node.metaType === 'node' && node.subtype === 'decisions') as FlowNode[]; + const getOperationElements: core.FlowNode[] = flow.elements.filter(node => node.metaType === 'node' && getOperations.includes(node.subtype)) as core.FlowNode[]; + const decisionElements: core.FlowNode[] = flow.elements.filter(node => node.metaType === 'node' && node.subtype === 'decisions') as core.FlowNode[]; const getOperationsWithoutNullHandler = []; for (const getElement of getOperationElements) { const elementName = getElement.name; diff --git a/src/main/rules/SOQLQueryInLoop.ts b/src/main/rules/SOQLQueryInLoop.ts index f351167..b0d3966 100644 --- a/src/main/rules/SOQLQueryInLoop.ts +++ b/src/main/rules/SOQLQueryInLoop.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowNode } from '../models/FlowNode'; import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import { Compiler } from '../libs/Compiler'; @@ -25,8 +24,8 @@ export class SOQLQueryInLoop extends RuleCommon implements IRuleDefinition { } const dmlStatementTypes = ['recordLookups']; - const loopElements: FlowNode[] = flow.elements.filter(node => node.subtype === 'loops') as FlowNode[]; - const dmlStatementsInLoops: FlowNode[] = []; + const loopElements: core.FlowNode[] = flow.elements.filter(node => node.subtype === 'loops') as core.FlowNode[]; + const dmlStatementsInLoops: core.FlowNode[] = []; const compiler = new Compiler(); // Check if a DML statement is inside a loop diff --git a/src/main/rules/UnconnectedElement.ts b/src/main/rules/UnconnectedElement.ts index 75655aa..1e4d860 100644 --- a/src/main/rules/UnconnectedElement.ts +++ b/src/main/rules/UnconnectedElement.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowNode } from '../models/FlowNode'; import { FlowElement } from '../models/FlowElement'; import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; @@ -23,7 +22,7 @@ export class UnconnectedElement extends RuleCommon implements IRuleDefinition { if (flow.type[0] === 'Survey') { return new core.RuleResult(this, []); } - const flowElements: FlowNode[] = flow.elements.filter(node => node instanceof FlowNode) as FlowNode[]; + const flowElements: core.FlowNode[] = flow.elements.filter(node => node instanceof core.FlowNode) as core.FlowNode[]; let indexesToProcess = [this.findStart(flowElements)]; const processedElementIndexes: number[] = []; const unconnectedElementIndexes: number[] = []; diff --git a/src/main/rules/UnusedVariable.ts b/src/main/rules/UnusedVariable.ts index 3fee51d..b3cdc2d 100644 --- a/src/main/rules/UnusedVariable.ts +++ b/src/main/rules/UnusedVariable.ts @@ -1,5 +1,4 @@ import {IRuleDefinition} from '../interfaces/IRuleDefinition'; -import {FlowNode} from '../models/FlowNode'; import {FlowType} from '../models/FlowType'; import {FlowVariable} from '../models/FlowVariable'; import {RuleCommon} from '../models/RuleCommon'; @@ -28,7 +27,7 @@ export class UnusedVariable extends RuleCommon implements IRuleDefinition{ for (const variable of flow.elements.filter(node => node instanceof FlowVariable) as FlowVariable[]) { // first check if any inside of flow elements const variableName = variable.name; - if ([...JSON.stringify(flow.elements.filter(node => node instanceof FlowNode)).matchAll(new RegExp(variableName, 'gi'))].map(a => a.index).length === 0) { + if ([...JSON.stringify(flow.elements.filter(node => node instanceof core.FlowNode)).matchAll(new RegExp(variableName, 'gi'))].map(a => a.index).length === 0) { // if none found check in other flow variables const insideCounter = [...JSON.stringify(variable).matchAll(new RegExp(variable.name, 'gi'))].map(a => a.index); const variableUsage = [...JSON.stringify(flow.elements.filter(node => node instanceof FlowVariable)).matchAll(new RegExp(variableName, 'gi'))].map(a => a.index); From 732f67d4efea532ccf8a5d683951783c49baad95 Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 1 Mar 2024 16:20:19 +0100 Subject: [PATCH 04/15] expose flowvar --- src/index.ts | 1 + src/main/libs/FixFlows.ts | 3 +-- src/main/models/Flow.ts | 2 +- src/main/models/FlowVariable.ts | 2 +- src/main/models/ResultDetails.ts | 2 +- src/main/rules/UnusedVariable.ts | 8 +++----- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/index.ts b/src/index.ts index 4e71b96..4b6b3d4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -57,6 +57,7 @@ export function fix(flows: Flow[]): ScanResult[] { export { default as Flow } from './main/models/Flow'; export { default as FlowNode } from './main/models/FlowNode'; +export { default as FlowVariable } from './main/models/FlowVariable'; export { default as ScanResult } from './main/models/ScanResult'; export { default as RuleResult } from './main/models/RuleResult'; export { default as ResultDetails } from './main/models/ResultDetails'; \ No newline at end of file diff --git a/src/main/libs/FixFlows.ts b/src/main/libs/FixFlows.ts index aa4baa7..f990eea 100644 --- a/src/main/libs/FixFlows.ts +++ b/src/main/libs/FixFlows.ts @@ -1,4 +1,3 @@ -import { FlowVariable } from '../models/FlowVariable'; import { UnconnectedElement } from '../rules/UnconnectedElement'; import { UnusedVariable } from '../rules/UnusedVariable'; import { BuildFlow } from './BuildFlow'; @@ -16,7 +15,7 @@ export function FixFlows(flows: core.Flow[]): core.ScanResult[] { const nodesToBuild = flow.elements.filter(node => { switch (node.metaType) { case 'variable': - const nodeVar = node as FlowVariable; + const nodeVar = node as core.FlowVariable; if (!unusedVariableReferences.includes(nodeVar.name)) { return node; } diff --git a/src/main/models/Flow.ts b/src/main/models/Flow.ts index 7f8197b..02e726c 100644 --- a/src/main/models/Flow.ts +++ b/src/main/models/Flow.ts @@ -1,7 +1,7 @@ import FlowNode from './FlowNode'; import { FlowMetadata } from './FlowMetadata'; import { FlowElement } from './FlowElement'; -import { FlowVariable } from './FlowVariable'; +import FlowVariable from './FlowVariable'; import * as p from 'path'; export default class Flow { diff --git a/src/main/models/FlowVariable.ts b/src/main/models/FlowVariable.ts index a19eaeb..b6bfa0f 100644 --- a/src/main/models/FlowVariable.ts +++ b/src/main/models/FlowVariable.ts @@ -1,6 +1,6 @@ import { FlowElement } from './FlowElement'; -export class FlowVariable extends FlowElement { +export default class FlowVariable extends FlowElement { public name: string; public dataType: string; diff --git a/src/main/models/ResultDetails.ts b/src/main/models/ResultDetails.ts index d545c00..668a749 100644 --- a/src/main/models/ResultDetails.ts +++ b/src/main/models/ResultDetails.ts @@ -1,6 +1,6 @@ import { FlowAttribute } from "./FlowAttribute"; import FlowNode from "./FlowNode"; -import { FlowVariable } from "./FlowVariable"; +import ssFlowVariable from "./FlowVariable"; export default class ResultDetails { diff --git a/src/main/rules/UnusedVariable.ts b/src/main/rules/UnusedVariable.ts index b3cdc2d..beb65f1 100644 --- a/src/main/rules/UnusedVariable.ts +++ b/src/main/rules/UnusedVariable.ts @@ -1,10 +1,8 @@ import {IRuleDefinition} from '../interfaces/IRuleDefinition'; import {FlowType} from '../models/FlowType'; -import {FlowVariable} from '../models/FlowVariable'; import {RuleCommon} from '../models/RuleCommon'; import * as core from '../../index'; - export class UnusedVariable extends RuleCommon implements IRuleDefinition{ constructor() { @@ -23,14 +21,14 @@ export class UnusedVariable extends RuleCommon implements IRuleDefinition{ if(flow.type[0] === 'Survey'){ return new core.RuleResult( this, []); } - const unusedVariables: FlowVariable[] = []; - for (const variable of flow.elements.filter(node => node instanceof FlowVariable) as FlowVariable[]) { + const unusedVariables: core.FlowVariable[] = []; + for (const variable of flow.elements.filter(node => node instanceof core.FlowVariable) as core.FlowVariable[]) { // first check if any inside of flow elements const variableName = variable.name; if ([...JSON.stringify(flow.elements.filter(node => node instanceof core.FlowNode)).matchAll(new RegExp(variableName, 'gi'))].map(a => a.index).length === 0) { // if none found check in other flow variables const insideCounter = [...JSON.stringify(variable).matchAll(new RegExp(variable.name, 'gi'))].map(a => a.index); - const variableUsage = [...JSON.stringify(flow.elements.filter(node => node instanceof FlowVariable)).matchAll(new RegExp(variableName, 'gi'))].map(a => a.index); + const variableUsage = [...JSON.stringify(flow.elements.filter(node => node instanceof core.FlowVariable)).matchAll(new RegExp(variableName, 'gi'))].map(a => a.index); if (variableUsage.length === insideCounter.length) { unusedVariables.push(variable); } From 96ba99ef8613219726181f92bf6b86faf179de1b Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 1 Mar 2024 16:20:42 +0100 Subject: [PATCH 05/15] rm typo --- src/main/models/ResultDetails.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/models/ResultDetails.ts b/src/main/models/ResultDetails.ts index 668a749..eb0748c 100644 --- a/src/main/models/ResultDetails.ts +++ b/src/main/models/ResultDetails.ts @@ -1,6 +1,6 @@ import { FlowAttribute } from "./FlowAttribute"; import FlowNode from "./FlowNode"; -import ssFlowVariable from "./FlowVariable"; +import FlowVariable from "./FlowVariable"; export default class ResultDetails { From 7973c74eca41818607cf4251ecf028e5952d10d3 Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 1 Mar 2024 16:28:57 +0100 Subject: [PATCH 06/15] exp flowtype --- src/index.ts | 2 ++ src/main/models/FlowType.ts | 2 +- src/main/rules/APIVersion.ts | 3 +-- src/main/rules/CopyAPIName.ts | 3 +-- src/main/rules/DMLStatementInLoop.ts | 3 +-- src/main/rules/DuplicateDMLOperation.ts | 3 +-- src/main/rules/FlowDescription.ts | 3 +-- src/main/rules/FlowName.ts | 3 +-- src/main/rules/HardcodedId.ts | 3 +-- src/main/rules/MissingFaultPath.ts | 3 +-- src/main/rules/MissingNullHandler.ts | 3 +-- src/main/rules/SOQLQueryInLoop.ts | 3 +-- src/main/rules/UnconnectedElement.ts | 3 +-- src/main/rules/UnusedVariable.ts | 3 +-- 14 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/index.ts b/src/index.ts index 4b6b3d4..0f7205c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -57,6 +57,8 @@ export function fix(flows: Flow[]): ScanResult[] { export { default as Flow } from './main/models/Flow'; export { default as FlowNode } from './main/models/FlowNode'; +export { default as FlowType } from './main/models/FlowType'; + export { default as FlowVariable } from './main/models/FlowVariable'; export { default as ScanResult } from './main/models/ScanResult'; export { default as RuleResult } from './main/models/RuleResult'; diff --git a/src/main/models/FlowType.ts b/src/main/models/FlowType.ts index 30651b5..d09c1b3 100644 --- a/src/main/models/FlowType.ts +++ b/src/main/models/FlowType.ts @@ -1,4 +1,4 @@ -export class FlowType { +export default class FlowType { public static backEndTypes = ['AutoLaunchedFlow', 'CustomEvent', 'InvocableProcess', 'Orchestrator', 'EvaluationFlow', 'ActionCadenceAutolaunchedFlow']; public static processBuilder = ['Workflow']; diff --git a/src/main/rules/APIVersion.ts b/src/main/rules/APIVersion.ts index 719f998..7a809fb 100644 --- a/src/main/rules/APIVersion.ts +++ b/src/main/rules/APIVersion.ts @@ -1,6 +1,5 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import * as core from '../../index'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import { FlowAttribute } from '../models/FlowAttribute'; @@ -12,7 +11,7 @@ export class APIVersion extends RuleCommon implements IRuleDefinition { label: 'Outdated API Version', description: "Introducing newer API components may lead to unexpected issues with older versions of Flows, as they might not align with the underlying mechanics. Starting from API version 50.0, the 'Api Version' attribute has been readily available on the Flow Object. To ensure smooth operation and reduce discrepancies between API versions, it is strongly advised to regularly update and maintain them.", type: 'flow', - supportedTypes: FlowType.allTypes(), + supportedTypes: core.FlowType.allTypes(), docRefs: [], isConfigurable: true }); diff --git a/src/main/rules/CopyAPIName.ts b/src/main/rules/CopyAPIName.ts index cbf85c0..8155596 100644 --- a/src/main/rules/CopyAPIName.ts +++ b/src/main/rules/CopyAPIName.ts @@ -1,6 +1,5 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import * as core from '../../index'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; export class CopyAPIName extends RuleCommon implements IRuleDefinition { @@ -11,7 +10,7 @@ export class CopyAPIName extends RuleCommon implements IRuleDefinition { label: 'Copy API Name', description: "Maintaining multiple elements with a similar name, like 'Copy_X_Of_Element,' can diminish the overall readability of your Flow. When copying and pasting these elements, it's crucial to remember to update the API name of the newly created copy.", type: 'pattern', - supportedTypes: FlowType.allTypes(), + supportedTypes: core.FlowType.allTypes(), docRefs: [], isConfigurable: false } diff --git a/src/main/rules/DMLStatementInLoop.ts b/src/main/rules/DMLStatementInLoop.ts index d27d1c6..6e741ec 100644 --- a/src/main/rules/DMLStatementInLoop.ts +++ b/src/main/rules/DMLStatementInLoop.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import { Compiler } from '../libs/Compiler'; import * as core from '../../index'; @@ -12,7 +11,7 @@ export class DMLStatementInLoop extends RuleCommon implements IRuleDefinition { label: 'DML Statement In A Loop', description: "To prevent exceeding Apex governor limits, it is advisable to consolidate all your database operations, including record creation, updates, or deletions, at the conclusion of the flow.", type: 'pattern', - supportedTypes: [...FlowType.backEndTypes, ...FlowType.visualTypes], + supportedTypes: [...core.FlowType.backEndTypes, ...core.FlowType.visualTypes], docRefs: [{ 'label': 'Flow Best Practices', 'path': 'https://help.salesforce.com/s/articleView?id=sf.flow_prep_bestpractices.htm&type=5' }], isConfigurable: false }); diff --git a/src/main/rules/DuplicateDMLOperation.ts b/src/main/rules/DuplicateDMLOperation.ts index defd006..0e2d52d 100644 --- a/src/main/rules/DuplicateDMLOperation.ts +++ b/src/main/rules/DuplicateDMLOperation.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; @@ -11,7 +10,7 @@ export class DuplicateDMLOperation extends RuleCommon implements IRuleDefinition label: 'Duplicate DML Operation', description: "When the flow executes database changes or actions between two screens, it's important to prevent users from navigating back between screens. Failure to do so may result in duplicate database operations being performed within the flow.", type: 'pattern', - supportedTypes: FlowType.visualTypes, + supportedTypes: core.FlowType.visualTypes, docRefs: [], isConfigurable: false }); diff --git a/src/main/rules/FlowDescription.ts b/src/main/rules/FlowDescription.ts index 7ca3509..38a3bbf 100644 --- a/src/main/rules/FlowDescription.ts +++ b/src/main/rules/FlowDescription.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import { FlowAttribute } from '../models/FlowAttribute'; import * as core from '../../index'; @@ -12,7 +11,7 @@ export class FlowDescription extends RuleCommon implements IRuleDefinition { label: 'Missing Flow Description', description: "Descriptions play a vital role in documentation. We highly recommend including details about where they are used and their intended purpose.", type: 'flow', - supportedTypes: FlowType.allTypes(), + supportedTypes: core.FlowType.allTypes(), docRefs: [], isConfigurable: false }); diff --git a/src/main/rules/FlowName.ts b/src/main/rules/FlowName.ts index 720f70e..660b3b7 100644 --- a/src/main/rules/FlowName.ts +++ b/src/main/rules/FlowName.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import { FlowAttribute } from '../models/FlowAttribute'; import * as core from '../../index'; @@ -12,7 +11,7 @@ export class FlowName extends RuleCommon implements IRuleDefinition { label: 'Flow Naming Convention', description: "The readability of a flow is of utmost importance. Establishing a naming convention for the Flow Name significantly enhances findability, searchability, and maintains overall consistency. It is advisable to include at least a domain and a brief description of the actions carried out in the flow, for instance, 'Service_OrderFulfillment'.", type: 'flow', - supportedTypes: FlowType.allTypes(), + supportedTypes: core.FlowType.allTypes(), docRefs: [{ 'label': "Naming your Flows is more critical than ever. By Stephen Church", 'path': 'https://www.linkedin.com/posts/stephen-n-church_naming-your-flows-this-is-more-critical-activity-7099733198175158274-1sPx?utm_source=share&utm_medium=member_desktop' }], isConfigurable: true }); diff --git a/src/main/rules/HardcodedId.ts b/src/main/rules/HardcodedId.ts index b324570..9639245 100644 --- a/src/main/rules/HardcodedId.ts +++ b/src/main/rules/HardcodedId.ts @@ -1,6 +1,5 @@ import * as IdPrefixes from '../data/IdPrefixes.json'; import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; @@ -12,7 +11,7 @@ export class HardcodedId extends RuleCommon implements IRuleDefinition { label: 'Hardcoded Id', description: 'Avoid hard-coding IDs as they are org-specific. Instead, pass them into variables at the start of the flow. You can achieve this by utilizing merge fields in URL parameters or employing a Get Records element.', type: 'pattern', - supportedTypes: FlowType.allTypes(), + supportedTypes: core.FlowType.allTypes(), docRefs: [{ 'label': 'Flow Best Practices', 'path': 'https://help.salesforce.com/s/articleView?id=sf.flow_prep_bestpractices.htm&type=5' }, {'label' : "Don't hard code Record Type IDs in Flow. By Stephen Church.", 'path' : 'https://www.linkedin.com/feed/update/urn:li:activity:6947530300012826624/?updateEntityUrn=urn%3Ali%3Afs_feedUpdate%3A%28V2%2Curn%3Ali%3Aactivity%3A6947530300012826624%29'}], isConfigurable: false }, diff --git a/src/main/rules/MissingFaultPath.ts b/src/main/rules/MissingFaultPath.ts index aaea27a..d94cfeb 100644 --- a/src/main/rules/MissingFaultPath.ts +++ b/src/main/rules/MissingFaultPath.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import { Compiler } from '../libs/Compiler'; import * as core from '../../index'; @@ -11,7 +10,7 @@ export class MissingFaultPath extends RuleCommon implements IRuleDefinition { label: 'Missing Fault Path', description: "At times, a flow may fail to execute a configured operation as intended. By default, the flow displays an error message to the user and notifies the admin who created the flow via email. However, you can customize this behavior by incorporating a Fault Path.", type: 'pattern', - supportedTypes: [...FlowType.backEndTypes, ...FlowType.visualTypes], + supportedTypes: [...core.FlowType.backEndTypes, ...core.FlowType.visualTypes], docRefs: [{ label: 'Flow Best Practices', path: 'https://help.salesforce.com/s/articleView?id=sf.flow_prep_bestpractices.htm&type=5' }], isConfigurable: false, }); diff --git a/src/main/rules/MissingNullHandler.ts b/src/main/rules/MissingNullHandler.ts index 1827760..1c0aad8 100644 --- a/src/main/rules/MissingNullHandler.ts +++ b/src/main/rules/MissingNullHandler.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowType } from '../models/FlowType'; import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; @@ -12,7 +11,7 @@ export class MissingNullHandler extends RuleCommon implements IRuleDefinition { label: 'Missing Null Handler', description: "When a Get Records operation doesn't find any data, it returns null. To ensure data validation, utilize a decision element on the operation result variable to check for a non-null result.", type: 'pattern', - supportedTypes: [...FlowType.backEndTypes, ...FlowType.visualTypes], + supportedTypes: [...core.FlowType.backEndTypes, ...core.FlowType.visualTypes], docRefs: [], isConfigurable: false }); diff --git a/src/main/rules/SOQLQueryInLoop.ts b/src/main/rules/SOQLQueryInLoop.ts index b0d3966..e0f7e4e 100644 --- a/src/main/rules/SOQLQueryInLoop.ts +++ b/src/main/rules/SOQLQueryInLoop.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import { Compiler } from '../libs/Compiler'; import * as core from '../../index'; @@ -12,7 +11,7 @@ export class SOQLQueryInLoop extends RuleCommon implements IRuleDefinition { label: 'SOQL Query In A Loop', description: "To prevent exceeding Apex governor limits, it is advisable to consolidate all your SOQL queries at the conclusion of the flow.", type: 'pattern', - supportedTypes: [...FlowType.backEndTypes, ...FlowType.visualTypes], + supportedTypes: [...core.FlowType.backEndTypes, ...core.FlowType.visualTypes], docRefs: [{ 'label': 'Flow Best Practices', 'path': 'https://help.salesforce.com/s/articleView?id=sf.flow_prep_bestpractices.htm&type=5' }], isConfigurable: false }); diff --git a/src/main/rules/UnconnectedElement.ts b/src/main/rules/UnconnectedElement.ts index 1e4d860..3c78d7e 100644 --- a/src/main/rules/UnconnectedElement.ts +++ b/src/main/rules/UnconnectedElement.ts @@ -1,6 +1,5 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { FlowElement } from '../models/FlowElement'; -import { FlowType } from '../models/FlowType'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; @@ -12,7 +11,7 @@ export class UnconnectedElement extends RuleCommon implements IRuleDefinition { label: 'Unconnected Element', description: "To maintain the efficiency and manageability of your Flow, it's best to avoid including unconnected elements that are not in use.", type: 'pattern', - supportedTypes: [...FlowType.backEndTypes, ...FlowType.visualTypes], + supportedTypes: [...core.FlowType.backEndTypes, ...core.FlowType.visualTypes], docRefs: [], isConfigurable: false }); diff --git a/src/main/rules/UnusedVariable.ts b/src/main/rules/UnusedVariable.ts index beb65f1..b4816b2 100644 --- a/src/main/rules/UnusedVariable.ts +++ b/src/main/rules/UnusedVariable.ts @@ -1,5 +1,4 @@ import {IRuleDefinition} from '../interfaces/IRuleDefinition'; -import {FlowType} from '../models/FlowType'; import {RuleCommon} from '../models/RuleCommon'; import * as core from '../../index'; @@ -11,7 +10,7 @@ export class UnusedVariable extends RuleCommon implements IRuleDefinition{ label: 'Unused Variable', description: "To maintain the efficiency and manageability of your Flow, it's advisable to avoid including unconnected variables that are not in use.", type: 'pattern', - supportedTypes: [...FlowType.backEndTypes, ...FlowType.visualTypes], + supportedTypes: [...core.FlowType.backEndTypes, ...core.FlowType.visualTypes], docRefs: [], isConfigurable: false }); From 0efe4bdc06450a91ca89c326e382eb088ace2aed Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 1 Mar 2024 16:36:51 +0100 Subject: [PATCH 07/15] exp flowattribute --- src/index.ts | 2 +- src/main/models/FlowAttribute.ts | 2 +- src/main/models/ResultDetails.ts | 2 +- src/main/rules/APIVersion.ts | 5 ++--- src/main/rules/FlowDescription.ts | 3 +-- src/main/rules/FlowName.ts | 3 +-- 6 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/index.ts b/src/index.ts index 0f7205c..01bd3f9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -56,9 +56,9 @@ export function fix(flows: Flow[]): ScanResult[] { } export { default as Flow } from './main/models/Flow'; +export { default as FlowAttribute } from './main/models/FlowAttribute'; export { default as FlowNode } from './main/models/FlowNode'; export { default as FlowType } from './main/models/FlowType'; - export { default as FlowVariable } from './main/models/FlowVariable'; export { default as ScanResult } from './main/models/ScanResult'; export { default as RuleResult } from './main/models/RuleResult'; diff --git a/src/main/models/FlowAttribute.ts b/src/main/models/FlowAttribute.ts index 21e5b46..ea3cfad 100644 --- a/src/main/models/FlowAttribute.ts +++ b/src/main/models/FlowAttribute.ts @@ -1,4 +1,4 @@ -export class FlowAttribute { +export default class FlowAttribute { public name: string; public subtype: string; diff --git a/src/main/models/ResultDetails.ts b/src/main/models/ResultDetails.ts index eb0748c..c821614 100644 --- a/src/main/models/ResultDetails.ts +++ b/src/main/models/ResultDetails.ts @@ -1,4 +1,4 @@ -import { FlowAttribute } from "./FlowAttribute"; +import FlowAttribute from "./FlowAttribute"; import FlowNode from "./FlowNode"; import FlowVariable from "./FlowVariable"; diff --git a/src/main/rules/APIVersion.ts b/src/main/rules/APIVersion.ts index 7a809fb..3bd93a1 100644 --- a/src/main/rules/APIVersion.ts +++ b/src/main/rules/APIVersion.ts @@ -1,7 +1,6 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import * as core from '../../index'; import { RuleCommon } from '../models/RuleCommon'; -import { FlowAttribute } from '../models/FlowAttribute'; export class APIVersion extends RuleCommon implements IRuleDefinition { @@ -28,13 +27,13 @@ export class APIVersion extends RuleCommon implements IRuleDefinition { if (options && options.expression) { const expressionEvaluation = eval(flowAPIVersionNumber + options.expression); return (!expressionEvaluation ? - new core.RuleResult(this, [new core.ResultDetails(new FlowAttribute(!expressionEvaluation ? ('' + flowAPIVersionNumber) : undefined, "apiVersion", options.expression))]) : + new core.RuleResult(this, [new core.ResultDetails(new core.FlowAttribute(!expressionEvaluation ? ('' + flowAPIVersionNumber) : undefined, "apiVersion", options.expression))]) : new core.RuleResult(this, [])); } else { return new core.RuleResult(this, []); } } else { - return new core.RuleResult(this, [new core.ResultDetails(new FlowAttribute('API Version <49', "apiVersion", "<49"))]); + return new core.RuleResult(this, [new core.ResultDetails(new core.FlowAttribute('API Version <49', "apiVersion", "<49"))]); } } } diff --git a/src/main/rules/FlowDescription.ts b/src/main/rules/FlowDescription.ts index 38a3bbf..4063d36 100644 --- a/src/main/rules/FlowDescription.ts +++ b/src/main/rules/FlowDescription.ts @@ -1,6 +1,5 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; -import { FlowAttribute } from '../models/FlowAttribute'; import * as core from '../../index'; export class FlowDescription extends RuleCommon implements IRuleDefinition { @@ -23,7 +22,7 @@ export class FlowDescription extends RuleCommon implements IRuleDefinition { } const missingFlowDescription = !flow.xmldata.description; return (missingFlowDescription ? - new core.RuleResult(this, [new core.ResultDetails(new FlowAttribute('undefined', "description", "!==null"))]) : + new core.RuleResult(this, [new core.ResultDetails(new core.FlowAttribute('undefined', "description", "!==null"))]) : new core.RuleResult(this, [])); } } \ No newline at end of file diff --git a/src/main/rules/FlowName.ts b/src/main/rules/FlowName.ts index 660b3b7..688530e 100644 --- a/src/main/rules/FlowName.ts +++ b/src/main/rules/FlowName.ts @@ -1,6 +1,5 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; -import { FlowAttribute } from '../models/FlowAttribute'; import * as core from '../../index'; export class FlowName extends RuleCommon implements IRuleDefinition { @@ -21,7 +20,7 @@ export class FlowName extends RuleCommon implements IRuleDefinition { const regexExp = (options && options.expression) ? options.expression : '[A-Za-z0-9]+_[A-Za-z0-9]+'; const conventionApplied = new RegExp(regexExp).test(flow.name); return (!conventionApplied ? - new core.RuleResult(this, [new core.ResultDetails(new FlowAttribute(flow.name, 'name', regexExp))]) : + new core.RuleResult(this, [new core.ResultDetails(new core.FlowAttribute(flow.name, 'name', regexExp))]) : new core.RuleResult(this, [])); } } From 770ab40c2930732123e6ded1beb9ce679af08965 Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 1 Mar 2024 16:39:51 +0100 Subject: [PATCH 08/15] exp flowelement --- src/index.ts | 1 + src/main/models/Flow.ts | 2 +- src/main/models/FlowElement.ts | 2 +- src/main/models/FlowMetadata.ts | 2 +- src/main/models/FlowNode.ts | 2 +- src/main/models/FlowVariable.ts | 2 +- src/main/rules/UnconnectedElement.ts | 3 +-- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index 01bd3f9..675de72 100644 --- a/src/index.ts +++ b/src/index.ts @@ -57,6 +57,7 @@ export function fix(flows: Flow[]): ScanResult[] { export { default as Flow } from './main/models/Flow'; export { default as FlowAttribute } from './main/models/FlowAttribute'; +export { default as FlowElement } from './main/models/FlowElement'; export { default as FlowNode } from './main/models/FlowNode'; export { default as FlowType } from './main/models/FlowType'; export { default as FlowVariable } from './main/models/FlowVariable'; diff --git a/src/main/models/Flow.ts b/src/main/models/Flow.ts index 02e726c..4d72d92 100644 --- a/src/main/models/Flow.ts +++ b/src/main/models/Flow.ts @@ -1,6 +1,6 @@ import FlowNode from './FlowNode'; import { FlowMetadata } from './FlowMetadata'; -import { FlowElement } from './FlowElement'; +import FlowElement from './FlowElement'; import FlowVariable from './FlowVariable'; import * as p from 'path'; diff --git a/src/main/models/FlowElement.ts b/src/main/models/FlowElement.ts index ab46484..628ace9 100644 --- a/src/main/models/FlowElement.ts +++ b/src/main/models/FlowElement.ts @@ -1,4 +1,4 @@ -export class FlowElement{ +export default class FlowElement{ public subtype:string; public metaType:string; diff --git a/src/main/models/FlowMetadata.ts b/src/main/models/FlowMetadata.ts index d6ca328..a9638df 100644 --- a/src/main/models/FlowMetadata.ts +++ b/src/main/models/FlowMetadata.ts @@ -1,4 +1,4 @@ -import {FlowElement} from './FlowElement'; +import FlowElement from './FlowElement'; export class FlowMetadata extends FlowElement{ diff --git a/src/main/models/FlowNode.ts b/src/main/models/FlowNode.ts index 57ced6d..f53ac8e 100644 --- a/src/main/models/FlowNode.ts +++ b/src/main/models/FlowNode.ts @@ -1,5 +1,5 @@ import { FlowElementConnector } from './FlowElementConnector'; -import { FlowElement } from './FlowElement'; +import FlowElement from './FlowElement'; export default class FlowNode extends FlowElement { diff --git a/src/main/models/FlowVariable.ts b/src/main/models/FlowVariable.ts index b6bfa0f..dce7994 100644 --- a/src/main/models/FlowVariable.ts +++ b/src/main/models/FlowVariable.ts @@ -1,4 +1,4 @@ -import { FlowElement } from './FlowElement'; +import FlowElement from './FlowElement'; export default class FlowVariable extends FlowElement { diff --git a/src/main/rules/UnconnectedElement.ts b/src/main/rules/UnconnectedElement.ts index 3c78d7e..8fe2a65 100644 --- a/src/main/rules/UnconnectedElement.ts +++ b/src/main/rules/UnconnectedElement.ts @@ -1,5 +1,4 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; -import { FlowElement } from '../models/FlowElement'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; @@ -85,7 +84,7 @@ export class UnconnectedElement extends RuleCommon implements IRuleDefinition { return new core.RuleResult(this, results); } - private findStart(nodes: FlowElement[]) { + private findStart(nodes: core.FlowElement[]) { return nodes.findIndex(n => { return n.subtype === 'start'; }); From 88c84dcdcf18f62ab782b5f5570cfd13633b9ed3 Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 1 Mar 2024 16:45:14 +0100 Subject: [PATCH 09/15] exp compiler --- src/index.ts | 1 + src/main/libs/Compiler.ts | 2 +- src/main/rules/DMLStatementInLoop.ts | 3 +-- src/main/rules/MissingFaultPath.ts | 5 ++--- src/main/rules/SOQLQueryInLoop.ts | 3 +-- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/index.ts b/src/index.ts index 675de72..b416019 100644 --- a/src/index.ts +++ b/src/index.ts @@ -61,6 +61,7 @@ export { default as FlowElement } from './main/models/FlowElement'; export { default as FlowNode } from './main/models/FlowNode'; export { default as FlowType } from './main/models/FlowType'; export { default as FlowVariable } from './main/models/FlowVariable'; +export { default as Compiler } from './main/libs/Compiler'; export { default as ScanResult } from './main/models/ScanResult'; export { default as RuleResult } from './main/models/RuleResult'; export { default as ResultDetails } from './main/models/ResultDetails'; \ No newline at end of file diff --git a/src/main/libs/Compiler.ts b/src/main/libs/Compiler.ts index 1a8cd9f..1e4635b 100644 --- a/src/main/libs/Compiler.ts +++ b/src/main/libs/Compiler.ts @@ -1,7 +1,7 @@ import Flow from '../models/Flow'; import FlowNode from '../models/FlowNode'; -export class Compiler { +export default class Compiler { private visitedElements: Set; constructor() { diff --git a/src/main/rules/DMLStatementInLoop.ts b/src/main/rules/DMLStatementInLoop.ts index 6e741ec..e7727f8 100644 --- a/src/main/rules/DMLStatementInLoop.ts +++ b/src/main/rules/DMLStatementInLoop.ts @@ -1,6 +1,5 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; -import { Compiler } from '../libs/Compiler'; import * as core from '../../index'; export class DMLStatementInLoop extends RuleCommon implements IRuleDefinition { @@ -25,7 +24,7 @@ export class DMLStatementInLoop extends RuleCommon implements IRuleDefinition { const dmlStatementTypes = ['recordDeletes', 'recordUpdates', 'recordCreates']; const loopElements: core.FlowNode[] = flow.elements.filter(node => node.subtype === 'loops') as core.FlowNode[]; const dmlStatementsInLoops: core.FlowNode[] = []; - const compiler = new Compiler(); + const compiler = new core.Compiler(); // Check if a DML statement is inside a loop for (const loopElement of loopElements) { diff --git a/src/main/rules/MissingFaultPath.ts b/src/main/rules/MissingFaultPath.ts index d94cfeb..5ea8f06 100644 --- a/src/main/rules/MissingFaultPath.ts +++ b/src/main/rules/MissingFaultPath.ts @@ -1,6 +1,5 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; -import { Compiler } from '../libs/Compiler'; import * as core from '../../index'; export class MissingFaultPath extends RuleCommon implements IRuleDefinition { @@ -21,7 +20,7 @@ export class MissingFaultPath extends RuleCommon implements IRuleDefinition { return new core.RuleResult(this, []); } - const compiler = new Compiler(); + const compiler = new core.Compiler(); const results: core.ResultDetails[] = []; const elementsWhereFaultPathIsApplicable = (flow.elements.filter((node) => node instanceof core.FlowNode && ['recordLookups', 'recordDeletes', 'recordUpdates', 'recordCreates', 'waits', 'actionCalls'].includes(node.subtype)) as core.FlowNode[]).map((e) => e.name); @@ -35,7 +34,7 @@ export class MissingFaultPath extends RuleCommon implements IRuleDefinition { } }; - // Use the Compiler for traversal + // Use the core.Compiler for traversal compiler.traverseFlow(flow, flow.startReference, visitCallback); return new core.RuleResult(this, results); diff --git a/src/main/rules/SOQLQueryInLoop.ts b/src/main/rules/SOQLQueryInLoop.ts index e0f7e4e..7411e0a 100644 --- a/src/main/rules/SOQLQueryInLoop.ts +++ b/src/main/rules/SOQLQueryInLoop.ts @@ -1,6 +1,5 @@ import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; -import { Compiler } from '../libs/Compiler'; import * as core from '../../index'; export class SOQLQueryInLoop extends RuleCommon implements IRuleDefinition { @@ -25,7 +24,7 @@ export class SOQLQueryInLoop extends RuleCommon implements IRuleDefinition { const dmlStatementTypes = ['recordLookups']; const loopElements: core.FlowNode[] = flow.elements.filter(node => node.subtype === 'loops') as core.FlowNode[]; const dmlStatementsInLoops: core.FlowNode[] = []; - const compiler = new Compiler(); + const compiler = new core.Compiler(); // Check if a DML statement is inside a loop for (const loopElement of loopElements) { From fcda9f7aaa75ef1490eb4b67f0201f1158f02675 Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 1 Mar 2024 18:44:20 +0100 Subject: [PATCH 10/15] Update RuleLoader.ts aa --- src/main/libs/RuleLoader.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/libs/RuleLoader.ts b/src/main/libs/RuleLoader.ts index e45dc5f..37c77fb 100644 --- a/src/main/libs/RuleLoader.ts +++ b/src/main/libs/RuleLoader.ts @@ -3,6 +3,12 @@ import { RuleParser } from "./RuleParser"; export class RuleLoader { static loadCustomRule(filePath: string): IRuleDefinition | undefined { - return RuleParser.parseRuleFile(filePath); + + // todo verify attributes & method + // return RuleParser.parseRuleFile(filePath); + const externalRule: any = require(filePath); + const customRuleInstance = new externalRule() as IRuleDefinition; + return customRuleInstance; + } -} +} \ No newline at end of file From 7bf7a7750cac6b533bfd57ee96cb391d348f02b5 Mon Sep 17 00:00:00 2001 From: Ruben Date: Mon, 4 Mar 2024 18:15:11 +0100 Subject: [PATCH 11/15] expose IRuleDefinition --- src/index.ts | 5 +++-- src/main/interfaces/IRuleDefinition.ts | 2 +- src/main/libs/GetRuleDefinitions.ts | 2 +- src/main/libs/RuleLoader.ts | 2 +- src/main/libs/RuleParser.ts | 2 +- src/main/libs/ScanFlows.ts | 3 +-- src/main/models/RuleResult.ts | 2 +- src/main/rules/APIVersion.ts | 3 +-- src/main/rules/CopyAPIName.ts | 3 +-- src/main/rules/DMLStatementInLoop.ts | 3 +-- src/main/rules/DuplicateDMLOperation.ts | 3 +-- src/main/rules/FlowDescription.ts | 3 +-- src/main/rules/FlowName.ts | 3 +-- src/main/rules/HardcodedId.ts | 3 +-- src/main/rules/MissingFaultPath.ts | 3 +-- src/main/rules/MissingNullHandler.ts | 3 +-- src/main/rules/SOQLQueryInLoop.ts | 3 +-- src/main/rules/UnconnectedElement.ts | 3 +-- src/main/rules/UnusedVariable.ts | 3 +-- 19 files changed, 21 insertions(+), 33 deletions(-) diff --git a/src/index.ts b/src/index.ts index b416019..501d096 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { IRuleDefinition } from './main/interfaces/IRuleDefinition'; +import IRuleDefinition from './main/interfaces/IRuleDefinition'; import { IRulesConfig } from './main/interfaces/IRulesConfig'; import { FixFlows } from './main/libs/FixFlows'; import { GetRuleDefinitions } from './main/libs/GetRuleDefinitions'; @@ -64,4 +64,5 @@ export { default as FlowVariable } from './main/models/FlowVariable'; export { default as Compiler } from './main/libs/Compiler'; export { default as ScanResult } from './main/models/ScanResult'; export { default as RuleResult } from './main/models/RuleResult'; -export { default as ResultDetails } from './main/models/ResultDetails'; \ No newline at end of file +export { default as ResultDetails } from './main/models/ResultDetails'; +export { default as IRuleDefinition } from './main/interfaces/IRuleDefinition'; diff --git a/src/main/interfaces/IRuleDefinition.ts b/src/main/interfaces/IRuleDefinition.ts index 3015138..b9d2ab6 100644 --- a/src/main/interfaces/IRuleDefinition.ts +++ b/src/main/interfaces/IRuleDefinition.ts @@ -1,7 +1,7 @@ import Flow from '../models/Flow'; import RuleResult from '../models/RuleResult'; -export interface IRuleDefinition { +export default interface IRuleDefinition { name: string; label: string; description: string; diff --git a/src/main/libs/GetRuleDefinitions.ts b/src/main/libs/GetRuleDefinitions.ts index dec1fd7..4164da8 100644 --- a/src/main/libs/GetRuleDefinitions.ts +++ b/src/main/libs/GetRuleDefinitions.ts @@ -1,4 +1,4 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; +import IRuleDefinition from '../interfaces/IRuleDefinition'; import { DefaultRuleStore } from '../store/DefaultRuleStore'; import { DynamicRule } from './DynamicRule'; import { RuleLoader } from './RuleLoader'; diff --git a/src/main/libs/RuleLoader.ts b/src/main/libs/RuleLoader.ts index 37c77fb..6569297 100644 --- a/src/main/libs/RuleLoader.ts +++ b/src/main/libs/RuleLoader.ts @@ -1,4 +1,4 @@ -import { IRuleDefinition } from "../interfaces/IRuleDefinition"; +import IRuleDefinition from "../interfaces/IRuleDefinition"; import { RuleParser } from "./RuleParser"; export class RuleLoader { diff --git a/src/main/libs/RuleParser.ts b/src/main/libs/RuleParser.ts index 43b4b4b..8481872 100644 --- a/src/main/libs/RuleParser.ts +++ b/src/main/libs/RuleParser.ts @@ -1,6 +1,6 @@ import * as ts from 'typescript'; import * as fs from 'fs'; -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; +import IRuleDefinition from '../interfaces/IRuleDefinition'; export class RuleParser { static parseRuleFile(filePath: string): IRuleDefinition | undefined { diff --git a/src/main/libs/ScanFlows.ts b/src/main/libs/ScanFlows.ts index 9a92fae..72342f1 100644 --- a/src/main/libs/ScanFlows.ts +++ b/src/main/libs/ScanFlows.ts @@ -1,4 +1,3 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { GetRuleDefinitions } from './GetRuleDefinitions'; import { keys } from './Keys'; import * as core from '../../index'; @@ -6,7 +5,7 @@ import * as core from '../../index'; export function ScanFlows(flows: core.Flow[], rulesConfig?: Map): core.ScanResult[] { const flowResults: core.ScanResult[] = []; - let selectedRules: IRuleDefinition[] = []; + let selectedRules: core.IRuleDefinition[] = []; if (rulesConfig) { selectedRules = GetRuleDefinitions(rulesConfig); } else { diff --git a/src/main/models/RuleResult.ts b/src/main/models/RuleResult.ts index 8853f33..6875344 100644 --- a/src/main/models/RuleResult.ts +++ b/src/main/models/RuleResult.ts @@ -1,4 +1,4 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; +import IRuleDefinition from '../interfaces/IRuleDefinition'; import ResultDetails from './ResultDetails'; export default class RuleResult { diff --git a/src/main/rules/APIVersion.ts b/src/main/rules/APIVersion.ts index 3bd93a1..5a18e87 100644 --- a/src/main/rules/APIVersion.ts +++ b/src/main/rules/APIVersion.ts @@ -1,8 +1,7 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import * as core from '../../index'; import { RuleCommon } from '../models/RuleCommon'; -export class APIVersion extends RuleCommon implements IRuleDefinition { +export class APIVersion extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/CopyAPIName.ts b/src/main/rules/CopyAPIName.ts index 8155596..883a6f4 100644 --- a/src/main/rules/CopyAPIName.ts +++ b/src/main/rules/CopyAPIName.ts @@ -1,8 +1,7 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import * as core from '../../index'; import { RuleCommon } from '../models/RuleCommon'; -export class CopyAPIName extends RuleCommon implements IRuleDefinition { +export class CopyAPIName extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/DMLStatementInLoop.ts b/src/main/rules/DMLStatementInLoop.ts index e7727f8..e7333e0 100644 --- a/src/main/rules/DMLStatementInLoop.ts +++ b/src/main/rules/DMLStatementInLoop.ts @@ -1,8 +1,7 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; -export class DMLStatementInLoop extends RuleCommon implements IRuleDefinition { +export class DMLStatementInLoop extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/DuplicateDMLOperation.ts b/src/main/rules/DuplicateDMLOperation.ts index 0e2d52d..4dc2289 100644 --- a/src/main/rules/DuplicateDMLOperation.ts +++ b/src/main/rules/DuplicateDMLOperation.ts @@ -1,8 +1,7 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; -export class DuplicateDMLOperation extends RuleCommon implements IRuleDefinition { +export class DuplicateDMLOperation extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/FlowDescription.ts b/src/main/rules/FlowDescription.ts index 4063d36..9d6da63 100644 --- a/src/main/rules/FlowDescription.ts +++ b/src/main/rules/FlowDescription.ts @@ -1,8 +1,7 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; -export class FlowDescription extends RuleCommon implements IRuleDefinition { +export class FlowDescription extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/FlowName.ts b/src/main/rules/FlowName.ts index 688530e..5c5c116 100644 --- a/src/main/rules/FlowName.ts +++ b/src/main/rules/FlowName.ts @@ -1,8 +1,7 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; -export class FlowName extends RuleCommon implements IRuleDefinition { +export class FlowName extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/HardcodedId.ts b/src/main/rules/HardcodedId.ts index 9639245..28d607b 100644 --- a/src/main/rules/HardcodedId.ts +++ b/src/main/rules/HardcodedId.ts @@ -1,9 +1,8 @@ import * as IdPrefixes from '../data/IdPrefixes.json'; -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; -export class HardcodedId extends RuleCommon implements IRuleDefinition { +export class HardcodedId extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/MissingFaultPath.ts b/src/main/rules/MissingFaultPath.ts index 5ea8f06..3271808 100644 --- a/src/main/rules/MissingFaultPath.ts +++ b/src/main/rules/MissingFaultPath.ts @@ -1,8 +1,7 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; -export class MissingFaultPath extends RuleCommon implements IRuleDefinition { +export class MissingFaultPath extends RuleCommon implements core.IRuleDefinition { constructor() { super({ name: 'MissingFaultPath', diff --git a/src/main/rules/MissingNullHandler.ts b/src/main/rules/MissingNullHandler.ts index 1c0aad8..889a501 100644 --- a/src/main/rules/MissingNullHandler.ts +++ b/src/main/rules/MissingNullHandler.ts @@ -1,9 +1,8 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import RuleResult from '../models/RuleResult'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; -export class MissingNullHandler extends RuleCommon implements IRuleDefinition { +export class MissingNullHandler extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/SOQLQueryInLoop.ts b/src/main/rules/SOQLQueryInLoop.ts index 7411e0a..5eb4c06 100644 --- a/src/main/rules/SOQLQueryInLoop.ts +++ b/src/main/rules/SOQLQueryInLoop.ts @@ -1,8 +1,7 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; -export class SOQLQueryInLoop extends RuleCommon implements IRuleDefinition { +export class SOQLQueryInLoop extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/UnconnectedElement.ts b/src/main/rules/UnconnectedElement.ts index 8fe2a65..a745546 100644 --- a/src/main/rules/UnconnectedElement.ts +++ b/src/main/rules/UnconnectedElement.ts @@ -1,8 +1,7 @@ -import { IRuleDefinition } from '../interfaces/IRuleDefinition'; import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; -export class UnconnectedElement extends RuleCommon implements IRuleDefinition { +export class UnconnectedElement extends RuleCommon implements core.IRuleDefinition { constructor() { super({ diff --git a/src/main/rules/UnusedVariable.ts b/src/main/rules/UnusedVariable.ts index b4816b2..9f5d22a 100644 --- a/src/main/rules/UnusedVariable.ts +++ b/src/main/rules/UnusedVariable.ts @@ -1,8 +1,7 @@ -import {IRuleDefinition} from '../interfaces/IRuleDefinition'; import {RuleCommon} from '../models/RuleCommon'; import * as core from '../../index'; -export class UnusedVariable extends RuleCommon implements IRuleDefinition{ +export class UnusedVariable extends RuleCommon implements core.IRuleDefinition { constructor() { super({ From c46656443e324b8d921c7a261553521dc0fea88e Mon Sep 17 00:00:00 2001 From: Ruben Date: Thu, 7 Mar 2024 18:24:24 +0100 Subject: [PATCH 12/15] fix compiler loop handling --- .yarn/install-state.gz | Bin 0 -> 158825 bytes .yarnrc.yml | 1 + src/main/libs/Compiler.ts | 39 +- src/main/libs/GetRuleDefinitions.ts | 8 +- src/main/rules/DMLStatementInLoop.ts | 34 +- src/main/rules/SOQLQueryInLoop.ts | 79 +- tests/CustomRuleTest.test.ts | 7 +- tests/SOQLQueryInALoop_Demo.test.ts | 15 +- tests/SOQLQueryInALoop_Demo_Fixed.test.ts | 16 +- tests/errorinloop.test.ts | 19 + tests/testfiles/inlooperror.json | 1529 +++++++++++ yarn.lock | 3056 ++++++++++++++------- 12 files changed, 3735 insertions(+), 1068 deletions(-) create mode 100644 .yarn/install-state.gz create mode 100644 .yarnrc.yml create mode 100644 tests/errorinloop.test.ts create mode 100644 tests/testfiles/inlooperror.json diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz new file mode 100644 index 0000000000000000000000000000000000000000..96581257eb5ad309812abcda7935f3a8154f46cd GIT binary patch literal 158825 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 + public visitedElements: Set; constructor() { this.visitedElements = new Set(); } - isInLoop = (flow: Flow, element: FlowNode, startOfLoop: FlowNode): boolean => { - const connectors = element.connectors || []; - for (const connector of connectors) { - if (connector.reference) { - const referencedElement = (flow.elements as FlowNode[]).find(el => el.name === connector.reference); - if (referencedElement === startOfLoop) { - return true; - } - if (this.isInLoop(flow, referencedElement, startOfLoop)) { - return true; - } - } - } - return false; - }; - - traverseFlow(flow: Flow, startElementName: string, visitCallback: (element: FlowNode) => void) { + traverseFlow(flow: Flow, startElementName: string, visitCallback: (element: FlowNode) => void, endElementName?: string) { // Iterative Deepening Depth-First Search (IDDFS) - // let depth = 0; let elementsToVisit = [startElementName]; - + while (elementsToVisit.length > 0) { const nextElements = []; - + for (const elementName of elementsToVisit) { if (!this.visitedElements.has(elementName)) { const currentElement = flow.elements.find(element => element instanceof FlowNode && element.name === elementName) as FlowNode; if (currentElement) { visitCallback(currentElement); this.visitedElements.add(elementName); - nextElements.push(...this.findNextElements(flow, currentElement)); + nextElements.push(...this.findNextElements(flow, currentElement, endElementName)); } } } - + + if (nextElements.length === 0) { // If no more next elements + break; // Terminate the traversal + } + elementsToVisit = nextElements; - // add logic to control depth or terminate the traversal based on requirements. - // depth++; } } - private findNextElements(flow: Flow, currentElement: FlowNode): string[] { + private findNextElements(flow: Flow, currentElement: FlowNode, endElementName?: string): string[] { const nextElements: string[] = []; if (currentElement.connectors && currentElement.connectors.length > 0) { @@ -59,7 +44,7 @@ export default class Compiler { const nextElement = flow.elements.find( element => element instanceof FlowNode && element.name === connector.reference ); - if (nextElement instanceof FlowNode) { + if (nextElement instanceof FlowNode && nextElement.name !== endElementName) { nextElements.push(nextElement.name); } } diff --git a/src/main/libs/GetRuleDefinitions.ts b/src/main/libs/GetRuleDefinitions.ts index 4164da8..726d4c0 100644 --- a/src/main/libs/GetRuleDefinitions.ts +++ b/src/main/libs/GetRuleDefinitions.ts @@ -15,9 +15,11 @@ export function GetRuleDefinitions(ruleConfig?: Map): IRuleDefinitio severity = configuredSeverity; } if(configuredPath){ - let customRule = RuleLoader.loadCustomRule(configuredPath); - selectedRules['severity'] = severity; - selectedRules.push(customRule); + + // TODO CR + // let customRule = RuleLoader.loadCustomRule(configuredPath); + // selectedRules['severity'] = severity; + // selectedRules.push(customRule); } else { const matchedRule = new DynamicRule(ruleName); matchedRule['severity'] = severity; diff --git a/src/main/rules/DMLStatementInLoop.ts b/src/main/rules/DMLStatementInLoop.ts index e7333e0..615ea7e 100644 --- a/src/main/rules/DMLStatementInLoop.ts +++ b/src/main/rules/DMLStatementInLoop.ts @@ -19,28 +19,32 @@ export class DMLStatementInLoop extends RuleCommon implements core.IRuleDefiniti if (flow.type[0] === 'Survey') { return new core.RuleResult(this, []); } - + const dmlStatementTypes = ['recordDeletes', 'recordUpdates', 'recordCreates']; const loopElements: core.FlowNode[] = flow.elements.filter(node => node.subtype === 'loops') as core.FlowNode[]; const dmlStatementsInLoops: core.FlowNode[] = []; - const compiler = new core.Compiler(); - - // Check if a DML statement is inside a loop - for (const loopElement of loopElements) { - const startOfLoop = loopElement; - compiler.traverseFlow(flow, loopElement.name, (element) => { - if (dmlStatementTypes.includes(element.subtype) && compiler.isInLoop(flow, element, startOfLoop)) { - dmlStatementsInLoops.push(element); - } - }); + const findDML = (element: core.FlowNode) => { + if (dmlStatementTypes.includes(element.subtype)) { + dmlStatementsInLoops.push(element); + } + }; + + for (const element of loopElements) { + let loopEnd: string | undefined; + // Check if 'noMoreValuesConnector' attribute exists + if (element.element['noMoreValuesConnector'] && element.element['noMoreValuesConnector'][0]) { + loopEnd = element.element['noMoreValuesConnector'][0].targetReference[0]; + } else { + loopEnd = element.name; + } + new core.Compiler().traverseFlow(flow, element.name, findDML, loopEnd); } - let results = []; - for (const det of dmlStatementsInLoops) { - results.push(new core.ResultDetails(det)); - } + // Create result details + const results = dmlStatementsInLoops.map(det => new core.ResultDetails(det)); return new core.RuleResult(this, results); } + } diff --git a/src/main/rules/SOQLQueryInLoop.ts b/src/main/rules/SOQLQueryInLoop.ts index 5eb4c06..188069e 100644 --- a/src/main/rules/SOQLQueryInLoop.ts +++ b/src/main/rules/SOQLQueryInLoop.ts @@ -2,46 +2,49 @@ import { RuleCommon } from '../models/RuleCommon'; import * as core from '../../index'; export class SOQLQueryInLoop extends RuleCommon implements core.IRuleDefinition { - - constructor() { - super({ - name: 'SOQLQueryInLoop', - label: 'SOQL Query In A Loop', - description: "To prevent exceeding Apex governor limits, it is advisable to consolidate all your SOQL queries at the conclusion of the flow.", - type: 'pattern', - supportedTypes: [...core.FlowType.backEndTypes, ...core.FlowType.visualTypes], - docRefs: [{ 'label': 'Flow Best Practices', 'path': 'https://help.salesforce.com/s/articleView?id=sf.flow_prep_bestpractices.htm&type=5' }], - isConfigurable: false - }); + + constructor() { + super({ + name: 'SOQLQueryInLoop', + label: 'SOQL Query In A Loop', + description: "To prevent exceeding Apex governor limits, it is advisable to consolidate all your SOQL queries at the conclusion of the flow.", + type: 'pattern', + supportedTypes: [...core.FlowType.backEndTypes, ...core.FlowType.visualTypes], + docRefs: [{ 'label': 'Flow Best Practices', 'path': 'https://help.salesforce.com/s/articleView?id=sf.flow_prep_bestpractices.htm&type=5' }], + isConfigurable: false + }); + } + + public execute(flow: core.Flow): core.RuleResult { + if (flow.type[0] === 'Survey') { + return new core.RuleResult(this, []); } - - public execute(flow: core.Flow): core.RuleResult { - if (flow.type[0] === 'Survey') { - return new core.RuleResult(this, []); - } - - const dmlStatementTypes = ['recordLookups']; - const loopElements: core.FlowNode[] = flow.elements.filter(node => node.subtype === 'loops') as core.FlowNode[]; - const dmlStatementsInLoops: core.FlowNode[] = []; - const compiler = new core.Compiler(); - - // Check if a DML statement is inside a loop - for (const loopElement of loopElements) { - const startOfLoop = loopElement; - - compiler.traverseFlow(flow, loopElement.name, (element) => { - if (dmlStatementTypes.includes(element.subtype) && compiler.isInLoop(flow, element, startOfLoop)) { - dmlStatementsInLoops.push(element); - } - }); + + const dmlStatementTypes = ['recordLookups']; + const loopElements: core.FlowNode[] = flow.elements.filter(node => node.subtype === 'loops') as core.FlowNode[]; + const soqlStatementsInLoops: core.FlowNode[] = []; + + const findDML = (element: core.FlowNode) => { + if (dmlStatementTypes.includes(element.subtype)) { + soqlStatementsInLoops.push(element); } - - let results = []; - for (const det of dmlStatementsInLoops) { - results.push(new core.ResultDetails(det)); + }; + + for (const element of loopElements) { + let loopEnd: string | undefined; + // Check if 'noMoreValuesConnector' attribute exists + if (element.element['noMoreValuesConnector'] && element.element['noMoreValuesConnector'][0]) { + loopEnd = element.element['noMoreValuesConnector'][0].targetReference[0]; + } else { + loopEnd = element.name; } - - return new core.RuleResult(this, results); + new core.Compiler().traverseFlow(flow, element.name, findDML, loopEnd); } + + // Create result details + const results = soqlStatementsInLoops.map(det => new core.ResultDetails(det)); + + return new core.RuleResult(this, results); } - \ No newline at end of file + +} diff --git a/tests/CustomRuleTest.test.ts b/tests/CustomRuleTest.test.ts index d9afd68..8f97087 100644 --- a/tests/CustomRuleTest.test.ts +++ b/tests/CustomRuleTest.test.ts @@ -3,7 +3,7 @@ import 'mocha'; import * as core from '../src' import Hidenav from './testfiles/hidenav.json'; -describe('With a custom rule', () => { +describe('A custom rule', () => { let flow: core.Flow; before('arrange', () => { @@ -13,7 +13,7 @@ describe('With a custom rule', () => { }); }); - it(' should have a result', () => { + it(' should be skipped for now without result', () => { const ruleConfig = { rules: { @@ -31,8 +31,7 @@ describe('With a custom rule', () => { }; const results: core.ScanResult[] = core.scan([flow], ruleConfig); - expect(results[0].ruleResults.length).to.equal(2); + expect(results[0].ruleResults.length).to.equal(1); expect(results[0].ruleResults[0].occurs).to.equal(true); - expect(results[0].ruleResults[1].occurs).to.equal(true); }); }); diff --git a/tests/SOQLQueryInALoop_Demo.test.ts b/tests/SOQLQueryInALoop_Demo.test.ts index 1eeadeb..36f0ef4 100644 --- a/tests/SOQLQueryInALoop_Demo.test.ts +++ b/tests/SOQLQueryInALoop_Demo.test.ts @@ -2,23 +2,18 @@ import { assert, expect } from 'chai'; import 'mocha'; import * as core from '../src' import flowfile from './testfiles/SOQLQueryInALoop_Demo.json'; +import { SOQLQueryInLoop } from '../src/main/rules/SOQLQueryInLoop'; describe('In the SOQLQueryInALoop Demo flow', () => { let flow: core.Flow; - before('arrange', () => { - // ARRANGE + it('there should be one result for the rule SOQLQueryInLoop', () => { flow = new core.Flow({ path: './testfiles/SOQL_Query_In_Loop_Demo.flow', xmldata: flowfile, }); - }); - - it('there should be one result for the rule SOQLQueryInLoop', () => { - - const results: core.ScanResult[] = core.scan([flow]); - const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); - expect(occurringResults.length).to.equal(1); - expect(occurringResults[0].ruleName).to.equal("SOQLQueryInLoop"); + const rule = new SOQLQueryInLoop(); + const result = rule.execute(flow); + expect(result.occurs); }); }); \ No newline at end of file diff --git a/tests/SOQLQueryInALoop_Demo_Fixed.test.ts b/tests/SOQLQueryInALoop_Demo_Fixed.test.ts index 3000147..f5fbef2 100644 --- a/tests/SOQLQueryInALoop_Demo_Fixed.test.ts +++ b/tests/SOQLQueryInALoop_Demo_Fixed.test.ts @@ -2,21 +2,19 @@ import { assert, expect } from 'chai'; import 'mocha'; import * as core from '../src'; import flowfile from './testfiles/SOQLQueryInALoop_Demo_Fixed.json'; +import { SOQLQueryInLoop } from '../src/main/rules/SOQLQueryInLoop'; describe('In the SOQLQueryInALoop_Fixed Demo flow', () => { let flow: core.Flow; - before('arrange', () => { - // ARRANGE + it('there should be no result for the rule SOQLQueryInLoop', () => { + flow = new core.Flow({ - path: './testfiles/SOQL_Query_In_Loop_Demo.flow', + path: './testfiles/SOQLQueryInALoop_Demo_Fixed.flow', xmldata: flowfile, }); - }); - - it('there should be no result for the rule SOQLQueryInLoop', () => { - const results: core.ScanResult[] = core.scan([flow]); - const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); - expect(occurringResults.length).to.equal(0); + const rule = new SOQLQueryInLoop(); + const result = rule.execute(flow); + expect(!result.occurs); }); }); \ No newline at end of file diff --git a/tests/errorinloop.test.ts b/tests/errorinloop.test.ts new file mode 100644 index 0000000..0e05adb --- /dev/null +++ b/tests/errorinloop.test.ts @@ -0,0 +1,19 @@ +import { assert, expect } from 'chai'; +import 'mocha'; +import * as core from '../src'; +import inlooperror from './testfiles/inlooperror.json'; + +describe('SOQLQueryInLoop ERROR ', () => { + let flow: core.Flow; + + it(' should not occur', () => { + + flow = new core.Flow({ + path: 'anypath', + xmldata: inlooperror, + }); + const results: core.ScanResult[] = core.scan([flow]); + console.log(results); + }); + +}); diff --git a/tests/testfiles/inlooperror.json b/tests/testfiles/inlooperror.json new file mode 100644 index 0000000..6309ef7 --- /dev/null +++ b/tests/testfiles/inlooperror.json @@ -0,0 +1,1529 @@ +{ + "Flow": { + "$": { + "xmlns": "http://soap.sforce.com/2006/04/metadata" + }, + "apiVersion": [ + "60.0" + ], + "assignments": [ + { + "name": [ + "Assign_LIGHT" + ], + "label": [ + "Assign_LIGHT" + ], + "locationX": [ + "402" + ], + "locationY": [ + "890" + ], + "assignmentItems": [ + { + "assignToReference": [ + "LightType_ID" + ], + "operator": [ + "Assign" + ], + "value": [ + { + "elementReference": [ + "Loop_RType.Id" + ] + } + ] + } + ], + "connector": [ + { + "targetReference": [ + "Loop_RType" + ] + } + ] + }, + { + "name": [ + "AssignFull" + ], + "label": [ + "Assign_Full" + ], + "locationX": [ + "138" + ], + "locationY": [ + "890" + ], + "assignmentItems": [ + { + "assignToReference": [ + "FullType_ID" + ], + "operator": [ + "Assign" + ], + "value": [ + { + "elementReference": [ + "Loop_RType.Id" + ] + } + ] + } + ], + "connector": [ + { + "targetReference": [ + "Loop_RType" + ] + } + ] + }, + { + "name": [ + "AssignRTValid" + ], + "label": [ + "Assign RType Valid" + ], + "locationX": [ + "138" + ], + "locationY": [ + "1490" + ], + "assignmentItems": [ + { + "assignToReference": [ + "GoNoGoType" + ], + "operator": [ + "Assign" + ], + "value": [ + { + "elementReference": [ + "RTEligible.CRM_GoNoGoType__c" + ] + } + ] + } + ], + "connector": [ + { + "targetReference": [ + "RTEligible" + ] + } + ] + } + ], + "choices": [ + { + "description": [ + "RecordType GonogoReview" + ], + "name": [ + "FullType_Label" + ], + "choiceText": [ + "{!$Label.CRM_GoNoGoReviewFullRType}" + ], + "dataType": [ + "String" + ], + "value": [ + { + "elementReference": [ + "FullType_ID" + ] + } + ] + }, + { + "name": [ + "LightType_Label" + ], + "choiceText": [ + "{!$Label.CRM_GoNoGoReviewLightRType}" + ], + "dataType": [ + "String" + ], + "value": [ + { + "elementReference": [ + "LightType_ID" + ] + } + ] + } + ], + "decisions": [ + { + "name": [ + "Dec_HasEditAccess" + ], + "label": [ + "Has Edit Access ?" + ], + "locationX": [ + "776" + ], + "locationY": [ + "242" + ], + "defaultConnector": [ + { + "targetReference": [ + "Screen_NoEditAccess" + ] + } + ], + "defaultConnectorLabel": [ + "Default Outcome" + ], + "rules": [ + { + "name": [ + "Out_EditAccess_Yes" + ], + "conditionLogic": [ + "and" + ], + "conditions": [ + { + "leftValueReference": [ + "Get_UserRecordAccess.varR_UserRecordAccessSingle.HasEditAccess" + ], + "operator": [ + "EqualTo" + ], + "rightValue": [ + { + "booleanValue": [ + "true" + ] + } + ] + } + ], + "connector": [ + { + "targetReference": [ + "GetOpportunity" + ] + } + ], + "label": [ + "Yes" + ] + } + ] + }, + { + "name": [ + "Decision_Amount" + ], + "label": [ + "Decision Amount" + ], + "locationX": [ + "270" + ], + "locationY": [ + "1382" + ], + "defaultConnector": [ + { + "targetReference": [ + "RTEligible" + ] + } + ], + "defaultConnectorLabel": [ + "Not Greater" + ], + "rules": [ + { + "name": [ + "AmmountGreaterOrEqual" + ], + "conditionLogic": [ + "and" + ], + "conditions": [ + { + "leftValueReference": [ + "GetOpportunity.Amount" + ], + "operator": [ + "GreaterThanOrEqualTo" + ], + "rightValue": [ + { + "elementReference": [ + "RTEligible.CRM_ThresholdAmount__c" + ] + } + ] + } + ], + "connector": [ + { + "targetReference": [ + "AssignRTValid" + ] + } + ], + "label": [ + "Greater or Equal" + ] + } + ] + }, + { + "name": [ + "Decision_NewGoNoGo" + ], + "label": [ + "Decision_NewGoNoGo" + ], + "locationX": [ + "446" + ], + "locationY": [ + "458" + ], + "defaultConnectorLabel": [ + "Default Outcome" + ], + "rules": [ + { + "name": [ + "True" + ], + "conditionLogic": [ + "and" + ], + "conditions": [ + { + "leftValueReference": [ + "GetOpportunity.CRM_GoNoGoReview__c" + ], + "operator": [ + "IsNull" + ], + "rightValue": [ + { + "booleanValue": [ + "true" + ] + } + ] + } + ], + "connector": [ + { + "targetReference": [ + "Get_RecordType" + ] + } + ], + "label": [ + "True" + ] + } + ] + }, + { + "name": [ + "Decision_RType" + ], + "label": [ + "Decision_RType" + ], + "locationX": [ + "402" + ], + "locationY": [ + "782" + ], + "defaultConnector": [ + { + "targetReference": [ + "Loop_RType" + ] + } + ], + "defaultConnectorLabel": [ + "Default Outcome" + ], + "rules": [ + { + "name": [ + "Decision_FULL" + ], + "conditionLogic": [ + "and" + ], + "conditions": [ + { + "leftValueReference": [ + "Loop_RType.DeveloperName" + ], + "operator": [ + "EqualTo" + ], + "rightValue": [ + { + "stringValue": [ + "CRM_GoNoGoFullVersion" + ] + } + ] + } + ], + "connector": [ + { + "targetReference": [ + "AssignFull" + ] + } + ], + "label": [ + "FULL" + ] + }, + { + "name": [ + "Decision_LIGHT" + ], + "conditionLogic": [ + "and" + ], + "conditions": [ + { + "leftValueReference": [ + "Loop_RType.DeveloperName" + ], + "operator": [ + "EqualTo" + ], + "rightValue": [ + { + "stringValue": [ + "CRM_GoNoGoLightVersion" + ] + } + ] + } + ], + "connector": [ + { + "targetReference": [ + "Assign_LIGHT" + ] + } + ], + "label": [ + "LIGHT" + ] + } + ] + } + ], + "description": [ + "Create a Go / No Go Review and update Opportunity" + ], + "environments": [ + "Default" + ], + "formulas": [ + { + "name": [ + "RTSelected" + ], + "dataType": [ + "String" + ], + "expression": [ + "IF({!GoNoGoType} == 'LIGHT', {!Screen_All}, {!Srceen_Full})" + ] + } + ], + "interviewLabel": [ + "CRM_Opportunity_NewGoNoGoReview {!$Flow.CurrentDateTime}" + ], + "label": [ + "CRM_Opportunity_NewGoNoGoReview" + ], + "loops": [ + { + "description": [ + "Build record type choice ( custom label and rtype id)" + ], + "name": [ + "Loop_RType" + ], + "label": [ + "Loop_RType" + ], + "locationX": [ + "50" + ], + "locationY": [ + "674" + ], + "collectionReference": [ + "Get_RecordType" + ], + "iterationOrder": [ + "Asc" + ], + "nextValueConnector": [ + { + "targetReference": [ + "Decision_RType" + ] + } + ], + "noMoreValuesConnector": [ + { + "targetReference": [ + "Get_MetaDataType" + ] + } + ] + }, + { + "name": [ + "RTEligible" + ], + "label": [ + "RType Eligible" + ], + "locationX": [ + "50" + ], + "locationY": [ + "1274" + ], + "collectionReference": [ + "Get_MetaDataType" + ], + "iterationOrder": [ + "Asc" + ], + "nextValueConnector": [ + { + "targetReference": [ + "Decision_Amount" + ] + } + ], + "noMoreValuesConnector": [ + { + "targetReference": [ + "New_Go_No_Go_Review" + ] + } + ] + } + ], + "processMetadataValues": [ + { + "name": [ + "BuilderType" + ], + "value": [ + { + "stringValue": [ + "LightningFlowBuilder" + ] + } + ] + }, + { + "name": [ + "CanvasMode" + ], + "value": [ + { + "stringValue": [ + "AUTO_LAYOUT_CANVAS" + ] + } + ] + }, + { + "name": [ + "OriginBuilderType" + ], + "value": [ + { + "stringValue": [ + "LightningFlowBuilder" + ] + } + ] + } + ], + "processType": [ + "Flow" + ], + "recordCreates": [ + { + "name": [ + "Create_GoNoGoReview" + ], + "label": [ + "Create GoNoGoReview" + ], + "locationX": [ + "50" + ], + "locationY": [ + "1874" + ], + "assignRecordIdToReference": [ + "GoNoGoID" + ], + "connector": [ + { + "targetReference": [ + "Update_Opportunity" + ] + } + ], + "faultConnector": [ + { + "targetReference": [ + "Parse_Flow_Fault_Error" + ] + } + ], + "inputAssignments": [ + { + "field": [ + "CRM_EstimatedAmount__c" + ], + "value": [ + { + "elementReference": [ + "cEstimatedAmount" + ] + } + ] + }, + { + "field": [ + "CRM_Opportunity__c" + ], + "value": [ + { + "elementReference": [ + "recordId" + ] + } + ] + }, + { + "field": [ + "RecordTypeId" + ], + "value": [ + { + "elementReference": [ + "RTSelected" + ] + } + ] + } + ], + "object": [ + "CRM_GoNoGoReview__c" + ] + } + ], + "recordLookups": [ + { + "name": [ + "Get_MetaDataType" + ], + "label": [ + "Get MetaDataType" + ], + "locationX": [ + "50" + ], + "locationY": [ + "1166" + ], + "assignNullValuesIfNoRecordsFound": [ + "false" + ], + "connector": [ + { + "targetReference": [ + "RTEligible" + ] + } + ], + "filterLogic": [ + "and" + ], + "filters": [ + { + "field": [ + "CRM_EngagementLevel__c" + ], + "operator": [ + "EqualTo" + ], + "value": [ + { + "elementReference": [ + "GetOpportunity.CRM_EngagementLevel__c" + ] + } + ] + }, + { + "field": [ + "CRM_Country__c" + ], + "operator": [ + "EqualTo" + ], + "value": [ + { + "elementReference": [ + "GetOpportunity.CRM_LegalEntityAddress__CountryCode__s" + ] + } + ] + } + ], + "getFirstRecordOnly": [ + "false" + ], + "object": [ + "CRM_GoNoGoCriteria__mdt" + ], + "sortField": [ + "CRM_ThresholdAmount__c" + ], + "sortOrder": [ + "Asc" + ], + "storeOutputAutomatically": [ + "true" + ] + }, + { + "name": [ + "Get_RecordType" + ], + "label": [ + "Get RecordType" + ], + "locationX": [ + "50" + ], + "locationY": [ + "566" + ], + "assignNullValuesIfNoRecordsFound": [ + "false" + ], + "connector": [ + { + "targetReference": [ + "Loop_RType" + ] + } + ], + "filterLogic": [ + "and" + ], + "filters": [ + { + "field": [ + "SobjectType" + ], + "operator": [ + "EqualTo" + ], + "value": [ + { + "stringValue": [ + "CRM_GoNoGoReview__c" + ] + } + ] + } + ], + "getFirstRecordOnly": [ + "false" + ], + "object": [ + "RecordType" + ], + "storeOutputAutomatically": [ + "true" + ] + }, + { + "name": [ + "GetOpportunity" + ], + "label": [ + "Get Opportunity" + ], + "locationX": [ + "446" + ], + "locationY": [ + "350" + ], + "assignNullValuesIfNoRecordsFound": [ + "false" + ], + "connector": [ + { + "targetReference": [ + "Decision_NewGoNoGo" + ] + } + ], + "filterLogic": [ + "and" + ], + "filters": [ + { + "field": [ + "Id" + ], + "operator": [ + "EqualTo" + ], + "value": [ + { + "elementReference": [ + "recordId" + ] + } + ] + } + ], + "getFirstRecordOnly": [ + "true" + ], + "object": [ + "Opportunity" + ], + "queriedFields": [ + "Id", + "Name", + "Amount", + "AccountId", + "CRM_OpportunityNumber__c", + "CurrencyIsoCode", + "CRM_EngagementLevel__c", + "CRM_GoNoGoReview__c", + "CRM_LegalEntityAddress__CountryCode__s" + ], + "storeOutputAutomatically": [ + "true" + ] + } + ], + "recordUpdates": [ + { + "name": [ + "Update_Opportunity" + ], + "label": [ + "Update_Opportunity" + ], + "locationX": [ + "50" + ], + "locationY": [ + "1982" + ], + "connector": [ + { + "targetReference": [ + "Screen_Redirect" + ] + } + ], + "faultConnector": [ + { + "isGoTo": [ + "true" + ], + "targetReference": [ + "Parse_Flow_Fault_Error" + ] + } + ], + "filterLogic": [ + "and" + ], + "filters": [ + { + "field": [ + "Id" + ], + "operator": [ + "EqualTo" + ], + "value": [ + { + "elementReference": [ + "recordId" + ] + } + ] + } + ], + "inputAssignments": [ + { + "field": [ + "CRM_GoNoGoReview__c" + ], + "value": [ + { + "elementReference": [ + "GoNoGoID" + ] + } + ] + } + ], + "object": [ + "Opportunity" + ] + } + ], + "runInMode": [ + "SystemModeWithoutSharing" + ], + "screens": [ + { + "name": [ + "New_Go_No_Go_Review" + ], + "label": [ + "New Go / No Go Review" + ], + "locationX": [ + "50" + ], + "locationY": [ + "1766" + ], + "allowBack": [ + "true" + ], + "allowFinish": [ + "true" + ], + "allowPause": [ + "true" + ], + "connector": [ + { + "targetReference": [ + "Create_GoNoGoReview" + ] + } + ], + "fields": [ + { + "name": [ + "Screen_Opportunity" + ], + "fieldText": [ + "

Opportunity

{!GetOpportunity.CRM_OpportunityNumber__c} - {!GetOpportunity.Name}

" + ], + "fieldType": [ + "DisplayText" + ] + }, + { + "name": [ + "cEstimatedAmount" + ], + "dataType": [ + "Currency" + ], + "defaultValue": [ + { + "elementReference": [ + "GetOpportunity.Amount" + ] + } + ], + "fieldText": [ + "Estimated Amount" + ], + "fieldType": [ + "InputField" + ], + "inputsOnNextNavToAssocScrn": [ + "UseStoredValues" + ], + "isRequired": [ + "true" + ], + "scale": [ + "2" + ] + }, + { + "name": [ + "New_Go_No_Go_Review_Section1" + ], + "fieldType": [ + "RegionContainer" + ], + "fields": [ + { + "name": [ + "New_Go_No_Go_Review_Section1_Column1" + ], + "fieldType": [ + "Region" + ], + "fields": [ + { + "name": [ + "Srceen_Full" + ], + "choiceReferences": [ + "FullType_Label" + ], + "dataType": [ + "String" + ], + "defaultSelectedChoiceReference": [ + "FullType_Label" + ], + "fieldText": [ + "Type de Go / No Go" + ], + "fieldType": [ + "RadioButtons" + ], + "inputsOnNextNavToAssocScrn": [ + "UseStoredValues" + ], + "isRequired": [ + "true" + ], + "visibilityRule": [ + { + "conditionLogic": [ + "and" + ], + "conditions": [ + { + "leftValueReference": [ + "GoNoGoType" + ], + "operator": [ + "EqualTo" + ], + "rightValue": [ + { + "stringValue": [ + "FULL" + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + "Screen_All" + ], + "choiceReferences": [ + "LightType_Label", + "FullType_Label" + ], + "dataType": [ + "String" + ], + "defaultSelectedChoiceReference": [ + "LightType_Label" + ], + "fieldText": [ + "Type de Go / No Go" + ], + "fieldType": [ + "RadioButtons" + ], + "inputsOnNextNavToAssocScrn": [ + "UseStoredValues" + ], + "isRequired": [ + "true" + ], + "visibilityRule": [ + { + "conditionLogic": [ + "and" + ], + "conditions": [ + { + "leftValueReference": [ + "GoNoGoType" + ], + "operator": [ + "EqualTo" + ], + "rightValue": [ + { + "stringValue": [ + "LIGHT" + ] + } + ] + } + ] + } + ] + } + ], + "inputParameters": [ + { + "name": [ + "width" + ], + "value": [ + { + "stringValue": [ + "6" + ] + } + ] + } + ], + "isRequired": [ + "false" + ] + }, + { + "name": [ + "New_Go_No_Go_Review_Section1_Column2" + ], + "fieldType": [ + "Region" + ], + "inputParameters": [ + { + "name": [ + "width" + ], + "value": [ + { + "stringValue": [ + "6" + ] + } + ] + } + ], + "isRequired": [ + "false" + ] + } + ], + "isRequired": [ + "false" + ], + "regionContainerType": [ + "SectionWithoutHeader" + ] + } + ], + "showFooter": [ + "true" + ], + "showHeader": [ + "true" + ] + }, + { + "name": [ + "scr_ShowFaultError" + ], + "label": [ + "scr_ShowFaultError" + ], + "locationX": [ + "578" + ], + "locationY": [ + "2090" + ], + "allowBack": [ + "true" + ], + "allowFinish": [ + "true" + ], + "allowPause": [ + "true" + ], + "fields": [ + { + "name": [ + "dis_Error" + ], + "fieldText": [ + "

The following error occurred:

{!Parse_Flow_Fault_Error.varT_OutputParsedFaultMessage}


If you need further assistance, please don't hesitate to reach out to your Admin.

" + ], + "fieldType": [ + "DisplayText" + ] + } + ], + "showFooter": [ + "true" + ], + "showHeader": [ + "true" + ] + }, + { + "name": [ + "Screen_NoEditAccess" + ], + "label": [ + "Edit Access" + ], + "locationX": [ + "1106" + ], + "locationY": [ + "350" + ], + "allowBack": [ + "true" + ], + "allowFinish": [ + "true" + ], + "allowPause": [ + "true" + ], + "fields": [ + { + "name": [ + "DText_NoEditAccess" + ], + "fieldText": [ + "

{!$Label.CRM_NoEditAccess}

" + ], + "fieldType": [ + "DisplayText" + ] + } + ], + "showFooter": [ + "true" + ], + "showHeader": [ + "true" + ] + }, + { + "name": [ + "Screen_Redirect" + ], + "label": [ + "Screen_Redirect" + ], + "locationX": [ + "50" + ], + "locationY": [ + "2090" + ], + "allowBack": [ + "true" + ], + "allowFinish": [ + "true" + ], + "allowPause": [ + "true" + ], + "fields": [ + { + "name": [ + "Redirect" + ], + "extensionName": [ + "c:crm_redirectToRecordFlow" + ], + "fieldType": [ + "ComponentInstance" + ], + "inputParameters": [ + { + "name": [ + "recordId" + ], + "value": [ + { + "elementReference": [ + "GoNoGoID" + ] + } + ] + } + ], + "inputsOnNextNavToAssocScrn": [ + "UseStoredValues" + ], + "isRequired": [ + "true" + ], + "storeOutputAutomatically": [ + "true" + ] + } + ], + "showFooter": [ + "false" + ], + "showHeader": [ + "false" + ] + } + ], + "start": [ + { + "locationX": [ + "650" + ], + "locationY": [ + "0" + ], + "connector": [ + { + "targetReference": [ + "Get_UserRecordAccess" + ] + } + ] + } + ], + "status": [ + "Active" + ], + "subflows": [ + { + "name": [ + "Get_UserRecordAccess" + ], + "label": [ + "Get UserRecordAccess" + ], + "locationX": [ + "776" + ], + "locationY": [ + "134" + ], + "connector": [ + { + "targetReference": [ + "Dec_HasEditAccess" + ] + } + ], + "flowName": [ + "CRM_GetUserRecordAccess" + ], + "inputAssignments": [ + { + "name": [ + "varT_InputSingleRecordId" + ], + "value": [ + { + "elementReference": [ + "recordId" + ] + } + ] + }, + { + "name": [ + "varT_UserId" + ], + "value": [ + { + "elementReference": [ + "$User.Id" + ] + } + ] + } + ], + "storeOutputAutomatically": [ + "true" + ] + }, + { + "name": [ + "Parse_Flow_Fault_Error" + ], + "label": [ + "Parse Flow Fault Error" + ], + "locationX": [ + "578" + ], + "locationY": [ + "1982" + ], + "connector": [ + { + "targetReference": [ + "scr_ShowFaultError" + ] + } + ], + "flowName": [ + "G_ParseFlowFaultMessage" + ], + "inputAssignments": [ + { + "name": [ + "varT_InputFaultMessage" + ], + "value": [ + { + "elementReference": [ + "$Flow.FaultMessage" + ] + } + ] + } + ], + "storeOutputAutomatically": [ + "true" + ] + } + ], + "variables": [ + { + "name": [ + "FullType_ID" + ], + "dataType": [ + "String" + ], + "isCollection": [ + "false" + ], + "isInput": [ + "false" + ], + "isOutput": [ + "false" + ] + }, + { + "name": [ + "GoNoGoID" + ], + "dataType": [ + "String" + ], + "isCollection": [ + "false" + ], + "isInput": [ + "false" + ], + "isOutput": [ + "false" + ] + }, + { + "name": [ + "GoNoGoType" + ], + "dataType": [ + "String" + ], + "isCollection": [ + "false" + ], + "isInput": [ + "false" + ], + "isOutput": [ + "false" + ], + "value": [ + { + "stringValue": [ + "LIGHT" + ] + } + ] + }, + { + "name": [ + "LightType_ID" + ], + "dataType": [ + "String" + ], + "isCollection": [ + "false" + ], + "isInput": [ + "false" + ], + "isOutput": [ + "false" + ] + }, + { + "name": [ + "recordId" + ], + "dataType": [ + "String" + ], + "isCollection": [ + "false" + ], + "isInput": [ + "true" + ], + "isOutput": [ + "false" + ] + } + ] + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b74a76b..bd7bb47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,962 +1,2094 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" - integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== - -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" - integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== - dependencies: - "@cspotcode/source-map-consumer" "0.8.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== - -"@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== - -"@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== - -"@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== - -"@types/chai@^4.2.21": - version "4.2.21" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.21.tgz#9f35a5643129df132cf3b5c1ec64046ea1af0650" - integrity sha512-yd+9qKmJxm496BOV9CMNaey8TWsikaZOwMRwPHQIjcOJM9oV+fi9ZMNw3JsVnbEEbo2gRTDnGEBv8pjyn67hNg== - -"@types/jsforce@^1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@types/jsforce/-/jsforce-1.11.0.tgz#ae702453bf3c691dec543b85ff938a539506254d" - integrity sha512-8ofRXHaHk2tgmxbEusRlo+NTItEly+SA3F1c+HAglvJ8LQK7Wzkvxjh3F4C0/sIpxUsowwAEgysPKWVtsT446g== - dependencies: - "@types/node" ">=4.0" - -"@types/mocha@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" - integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== - -"@types/node@>=4.0": - version "20.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" - integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== - -"@types/node@^20.4.5": - version "20.4.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69" - integrity sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg== - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -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.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== - -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-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@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -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.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" - -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" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - 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== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -balanced-match@^1.0.0: - version "1.0.2" - 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" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -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== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -chai@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.1" - type-detect "^4.0.5" - -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== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -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" - -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" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -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@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -debug@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -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== - -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" - -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" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -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== - -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.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -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== - -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== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -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.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" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.1: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -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== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -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: - binary-extensions "^2.0.0" - -is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== - dependencies: - has "^1.0.3" - -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@^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: - 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-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -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-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== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -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@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 "^2.0.1" - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.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" - -log-symbols@4.1.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== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -logging@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/logging/-/logging-3.3.0.tgz#5743f9154f790308c5d6f2e28196dd0259fcf0ad" - integrity sha512-Hnmu3KlGTbXMVS7ONjBpnjjiF9cBlK5qsmj77sOcqRkNpvO9ouUGPKe2PmBCWWYpKAbxb96b08cYEv4hiBk3lQ== - dependencies: - chalk "^4.1.0" - debug "^4.3.1" - nicely-format "^1.1.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.4: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mocha@^9.1.1: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.3" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "4.2.1" - ms "2.1.3" - nanoid "3.3.1" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -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.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== - -nicely-format@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/nicely-format/-/nicely-format-1.1.0.tgz#6c3513d1f38077d65ed9721e716a8e1917ba27b6" - integrity sha1-bDUT0fOAd9Ze2XIecWqOGRe6J7Y= - dependencies: - ansi-styles "^2.2.1" - esutils "^2.0.2" - -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== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -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: - safe-buffer "^5.1.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" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve@^1.3.2: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -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== - -semver@^5.3.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -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" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-json-comments@3.1.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@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 "^4.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.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" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-node@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" - integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== - dependencies: - "@cspotcode/source-map-support" "0.6.1" - "@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" - yn "3.1.1" - -tslib@^1.13.0, tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslint@^6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" - integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.3" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.13.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -typescript@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc" - integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew== - -which@2.0.2: - 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" - -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -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== - -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@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-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" - -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== +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@babel/code-frame@npm:^7.0.0": + version: 7.14.5 + resolution: "@babel/code-frame@npm:7.14.5" + dependencies: + "@babel/highlight": "npm:^7.14.5" + checksum: 10c0/6dd398ce8d7981f78236c1d02878b32f9d4ab953bcc6bae3fa472370f61c4f45a2db188ea5560e3615d8bdd44c1c69bb3c21997a19d57607183f864e73539946 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/helper-validator-identifier@npm:7.14.5" + checksum: 10c0/b80e89eb3609f2b6fb8f7baaf988a1840d317e84e479c64d5e903eb9cf3d4fd1ee7f98bbaa8b0402cbc34cc2ec443fbdbce7022e07db26ed3a81ab542b552f3f + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/highlight@npm:7.14.5" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.14.5" + chalk: "npm:^2.0.0" + js-tokens: "npm:^4.0.0" + checksum: 10c0/b9d16895e4bf780d69504c7cc8a9871dc668bcd1851c4a7a7f039f34ba5bb1f04efc4ad6b79112496c7896d541a4d38efa02e7d8be8fb0a1f352097cff8ba79d + languageName: node + linkType: hard + +"@cspotcode/source-map-consumer@npm:0.8.0": + version: 0.8.0 + resolution: "@cspotcode/source-map-consumer@npm:0.8.0" + checksum: 10c0/44428e50f896df065c3a22d6bddeac344f3e31af57cbc2ddf753a95addcabbe685d92e534f4dcde0cabbbcfbc122d1cb957785b36344d54c422b781a8d1a2a01 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:0.6.1": + version: 0.6.1 + resolution: "@cspotcode/source-map-support@npm:0.6.1" + dependencies: + "@cspotcode/source-map-consumer": "npm:0.8.0" + checksum: 10c0/f5432af7de60ed490a3222e1ff97ef351084e65d71aa4eb40677cf055ed38cd4b28fb465e33efd8ad60518c2bb3779f9539886b1f303cd1fc5e91c0de5b1f2e6 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.1 + resolution: "@npmcli/agent@npm:2.2.1" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 10c0/38ee5cbe8f3cde13be916e717bfc54fd1a7605c07af056369ff894e244c221e0b56b08ca5213457477f9bc15bca9e729d51a4788829b5c3cf296b3c996147f76 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.8 + resolution: "@tsconfig/node10@npm:1.0.8" + checksum: 10c0/d400f7b5c02acd74620f892c0f41cea39e7c1b5f7f272ad6f127f4b1fba23346b2d8e30d272731a733675494145f6aa74f9faf050390c034c7c553123ab979b3 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node12@npm:1.0.9" + checksum: 10c0/fc1fb68a89d8a641953036d23d95fe68f69f74d37a499db20791b09543ad23afe7ae9ee0840eea92dd470bdcba69eef6f1ed3fe90ba64d763bcd3f738e364597 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.1 + resolution: "@tsconfig/node14@npm:1.0.1" + checksum: 10c0/abd4e27d9ad712e1e229716a3dbf35d5cbb580d624a82d67414e7606cefd85d502e58800a2ab930d46a428fcfcb199436283b1a88e47d738ca1a5f7fd022ee74 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.2 + resolution: "@tsconfig/node16@npm:1.0.2" + checksum: 10c0/d402706562444a173d48810d13fdf866c78f1b876ed8962eeac6c7cddf4e29e8aaa06dc28093219e3e9eb6316799cf4d9a7acba62c6a4e215ee0c94d83f9081f + languageName: node + linkType: hard + +"@types/chai@npm:^4.2.21": + version: 4.2.21 + resolution: "@types/chai@npm:4.2.21" + checksum: 10c0/254cd6e15afcb3640083c4dbe93fc127ff8d4cafb0214c2538996a24fd2c77181a34c27ea0603f8e2229de8d567d888d353e760a9b3e90a3c3842c945d917e3d + languageName: node + linkType: hard + +"@types/jsforce@npm:^1.11.0": + version: 1.11.0 + resolution: "@types/jsforce@npm:1.11.0" + dependencies: + "@types/node": "npm:>=4.0" + checksum: 10c0/1c03125686f23d4b8bb4bc960d0cba4d74519d67d3229a138f569a380fbd8db8f62ac64a2956957a0def4ef3268d90513b471c23cb42449e6eb26b6c9cd3b7c9 + languageName: node + linkType: hard + +"@types/mocha@npm:^9.0.0": + version: 9.0.0 + resolution: "@types/mocha@npm:9.0.0" + checksum: 10c0/82501aa1453ffe204d94f0a975e2ff266bfe38fb66a788a6c1fd72db3b7707534fb28f60b99eee128b22df7efa2b3064c57e749ec5f142d294854bb43f3da82d + languageName: node + linkType: hard + +"@types/node@npm:>=4.0": + version: 20.3.2 + resolution: "@types/node@npm:20.3.2" + checksum: 10c0/d857cbe388d11fefd6c598144db42a32e1c15c09624b9e0669ec65e9d72e080093db3ec6b536037e6575574e33413479d4b3762140c2544ff30eb0c2111b5596 + languageName: node + linkType: hard + +"@types/node@npm:^20.4.5": + version: 20.4.5 + resolution: "@types/node@npm:20.4.5" + checksum: 10c0/ed414b8fea1b462cb7444464e18cf0786a11def8b863bcca52b0466992d04f701422f9fc3c33e0601444bfdbf9e18d8f4b163d35902758495b51e635b09fee64 + languageName: node + linkType: hard + +"@ungap/promise-all-settled@npm:1.1.2": + version: 1.1.2 + resolution: "@ungap/promise-all-settled@npm:1.1.2" + checksum: 10c0/7f9862bae3b6ce30675783428933be1738dca278901a6bcb55c29b8f54c08863ec8e6a7c884119877d90336501c33b7cfda36355ec7af4d703f65f54cb768913 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 10c0/dbe92f5b2452c93e960c5594e666dd1fae141b965ff2cb4a1e1d0381e3e4db4274c5ce4ffa3d681a86ca2a8d4e29d5efc0670a08e23fd2800051ea387df56ca2 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1": + version: 8.5.0 + resolution: "acorn@npm:8.5.0" + bin: + acorn: bin/acorn + checksum: 10c0/a0cd0009d215df0c5a6c69ea40a5e784114f1b89d5649d663264ccbb855d4c6b6da6936fed607078b7d681bd8d8f2e730dad25931edbdef709bc4b520c0caa80 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: "npm:^4.3.4" + checksum: 10c0/fc974ab57ffdd8421a2bc339644d312a9cca320c20c3393c9d8b1fd91731b9bbabdb985df5fc860f5b79d81c3e350daa3fcb31c5c07c0bb385aafc817df004ce + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"ansi-colors@npm:4.1.1": + version: 4.1.1 + resolution: "ansi-colors@npm:4.1.1" + checksum: 10c0/6086ade4336b4250b6b25e144b83e5623bcaf654d3df0c3546ce09c9c5ff999cb6a6f00c87e802d05cf98aef79d92dc76ade2670a2493b8dcb80220bec457838 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + languageName: node + linkType: hard + +"ansi-styles@npm:^2.2.1": + version: 2.2.1 + resolution: "ansi-styles@npm:2.2.1" + checksum: 10c0/7c68aed4f1857389e7a12f85537ea5b40d832656babbf511cc7ecd9efc52889b9c3e5653a71a6aade783c3c5e0aa223ad4ff8e83c27ac8a666514e6c79068cab + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: 10c0/25456b2aa333250f01143968e02e4884a34588a8538fbbf65c91a637f1dbfb8069249133cd2f4e530f10f624d206a664e7df30207830b659e9f5298b00a4099b + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: 10c0/d73d8b897238a2d3ffa5f59c0241870043aa7471335e89ea5e1ff48edb7c2d0bb471517a3e4c5c3f4c043615caa2717b5f80a5e61e07503d51dc85cb848e665d + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: "npm:^7.0.1" + checksum: 10c0/321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 + languageName: node + linkType: hard + +"browser-stdout@npm:1.3.1": + version: 1.3.1 + resolution: "browser-stdout@npm:1.3.1" + checksum: 10c0/c40e482fd82be872b6ea7b9f7591beafbf6f5ba522fe3dade98ba1573a1c29a11101564993e4eb44e5488be8f44510af072df9a9637c739217eb155ceb639205 + languageName: node + linkType: hard + +"builtin-modules@npm:^1.1.1": + version: 1.1.1 + resolution: "builtin-modules@npm:1.1.1" + checksum: 10c0/58d72ea7f59db3c2ae854e1058d85b226f75ff7386d0f71d628e25a600383fc6652af218e20ba2361925c605a4144590ceb890dfdca298fdf8f3d040c0591a23 + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.2 + resolution: "cacache@npm:18.0.2" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 10c0/7992665305cc251a984f4fdbab1449d50e88c635bc43bf2785530c61d239c61b349e5734461baa461caaee65f040ab14e2d58e694f479c0810cffd181ba5eabc + languageName: node + linkType: hard + +"camelcase@npm:^6.0.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 + languageName: node + linkType: hard + +"chai@npm:^4.3.4": + version: 4.3.4 + resolution: "chai@npm:4.3.4" + dependencies: + assertion-error: "npm:^1.1.0" + check-error: "npm:^1.0.2" + deep-eql: "npm:^3.0.1" + get-func-name: "npm:^2.0.0" + pathval: "npm:^1.1.1" + type-detect: "npm:^4.0.5" + checksum: 10c0/e8be63a3ce412cc35f0209799c96b1f67397c4829489bd1604f9639f291b697f9a8c1ee129f5d502663332691950b278d2be7e8f19d753b86ea1876e99771a8e + languageName: node + linkType: hard + +"chalk@npm:^2.0.0, chalk@npm:^2.3.0": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + languageName: node + linkType: hard + +"chalk@npm:^4.1.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"check-error@npm:^1.0.2": + version: 1.0.2 + resolution: "check-error@npm:1.0.2" + checksum: 10c0/c58ac4d6a92203209a61d025568198c073f101691eb6247f999266e1d1e3ab3af2bbe0a41af5008c1f1b95446ec7831e6ba91f03816177f2da852f316ad7921d + languageName: node + linkType: hard + +"chokidar@npm:3.5.3": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/6035f5daf7383470cef82b3d3db00bec70afb3423538c50394386ffbbab135e26c3689c41791f911fa71b62d13d3863c712fdd70f0fbdffd938a1e6fd09aac00 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"commander@npm:^2.12.1": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"debug@npm:4.3.3": + version: 4.3.3 + resolution: "debug@npm:4.3.3" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/31873df69ff7036ce4f4158dcd6f71cd399b834ab1efbf23383f660822d28c7e29442fa83d34ccdd2f5201ff69eb494f0c7e8c01ecd314f0207bb631bb048ac0 + languageName: node + linkType: hard + +"debug@npm:^4.3.1": + version: 4.3.2 + resolution: "debug@npm:4.3.2" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/3cc408070bcee066ee9b2a4f3a9c40f53728919ec7c7ff568f7c3a75b0723cb5a8407191a63495be4e10669e99b0ff7f26ec70e10b025da1898cdce4876d96ca + languageName: node + linkType: hard + +"decamelize@npm:^4.0.0": + version: 4.0.0 + resolution: "decamelize@npm:4.0.0" + checksum: 10c0/e06da03fc05333e8cd2778c1487da67ffbea5b84e03ca80449519b8fa61f888714bbc6f459ea963d5641b4aa98832130eb5cd193d90ae9f0a27eee14be8e278d + languageName: node + linkType: hard + +"deep-eql@npm:^3.0.1": + version: 3.0.1 + resolution: "deep-eql@npm:3.0.1" + dependencies: + type-detect: "npm:^4.0.0" + checksum: 10c0/80b33c1c7713b3d5db89e6b5e9b22050f39c8a88e12a015616da8391e013988790d045a5c612b0c6dc43cc4bec51eadbe0fcf6075cc9717f8f56efdb305b6e6f + languageName: node + linkType: hard + +"diff@npm:5.0.0": + version: 5.0.0 + resolution: "diff@npm:5.0.0" + checksum: 10c0/08c5904779bbababcd31f1707657b1ad57f8a9b65e6f88d3fb501d09a965d5f8d73066898a7d3f35981f9e4101892c61d99175d421f3b759533213c253d91134 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + +"dom-walk@npm:^0.1.0": + version: 0.1.2 + resolution: "dom-walk@npm:0.1.2" + checksum: 10c0/4d2ad9062a9423d890f8577aa202b597a6b85f9489bdde656b9443901b8b322b289655c3affefc58ec2e41931e0828dfee0a1d2db6829a607d76def5901fc5a9 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: 10c0/afd02e6ca91ffa813e1108b5e7756566173d6bc0d1eb951cb44d6b21702ec17c1cf116cfe75d4a2b02e05acb0b808a7a9387d0d1ca5cf9c04ad03a8445c3e46d + languageName: node + linkType: hard + +"escape-string-regexp@npm:4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + languageName: node + linkType: hard + +"find-up@npm:5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: 10c0/60b74b2407e1942e1ed7f8c284f8ef714d0689dcfce5319985a5b7da3fc727f40b4a59ec72dc55aa83365ad7b8fa4fac3a30d93c850a2b452f29ae03dbc10a1e + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-func-name@npm:^2.0.0": + version: 2.0.0 + resolution: "get-func-name@npm:2.0.0" + checksum: 10c0/ed8791f7ba92cfd747259dff7ec8b6cc42734cebd031fb58c99a6e71d24d3532d84b46ad7806cafad6ad21784dd04ae1808a002d2b21001425e21f5f394c34e7 + languageName: node + linkType: hard + +"glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob@npm:7.2.0": + version: 7.2.0 + resolution: "glob@npm:7.2.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.0.4" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/478b40e38be5a3d514e64950e1e07e0ac120585add6a37c98d0ed24d72d9127d734d2a125786073c8deb687096e84ae82b641c441a869ada3a9cc91b68978632 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.5" + minimatch: "npm:^9.0.1" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry: "npm:^1.10.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + languageName: node + linkType: hard + +"glob@npm:^7.1.1": + version: 7.1.7 + resolution: "glob@npm:7.1.7" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.0.4" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/173245e6f9ccf904309eb7ef4a44a11f3bf68e9e341dff5a28b5db0dd7123b7506daf41497f3437a0710f57198187b758c2351eeaabce4d16935e956920da6a4 + languageName: node + linkType: hard + +"global@npm:^4.4.0": + version: 4.4.0 + resolution: "global@npm:4.4.0" + dependencies: + min-document: "npm:^2.19.0" + process: "npm:^0.11.10" + checksum: 10c0/4a467aec6602c00a7c5685f310574ab04e289ad7f894f0f01c9c5763562b82f4b92d1e381ce6c5bbb12173e2a9f759c1b63dda6370cfb199970267e14d90aa91 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"growl@npm:1.10.5": + version: 1.10.5 + resolution: "growl@npm:1.10.5" + checksum: 10c0/a6a8f4df1269ac321f9e41c310552f3568768160942b6c9a7c116fcff1e3921f6a48fb7520689660412f7d1e5d46f76214e05406b23eee9e213830fdc2f772fe + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: "npm:^1.1.1" + checksum: 10c0/e1da0d2bd109f116b632f27782cf23182b42f14972ca9540e4c5aa7e52647407a0a4a76937334fddcb56befe94a3494825ec22b19b51f5e5507c3153fd1a5e1b + languageName: node + linkType: hard + +"he@npm:1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.4 + resolution: "https-proxy-agent@npm:7.0.4" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + +"is-core-module@npm:^2.2.0": + version: 2.4.0 + resolution: "is-core-module@npm:2.4.0" + dependencies: + has: "npm:^1.0.3" + checksum: 10c0/7df2fceca99f8b711e386a86217f6d9d21aac31d86ae2461225ff8b6b148e2a7a444cb64635fe702e56e7f75eb43e4f0b16d83595c28a131664da093fbfa4de7 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-plain-obj@npm:^2.1.0": + version: 2.1.0 + resolution: "is-plain-obj@npm:2.1.0" + checksum: 10c0/e5c9814cdaa627a9ad0a0964ded0e0491bfd9ace405c49a5d63c88b30a162f1512c069d5b80997893c4d0181eadc3fed02b4ab4b81059aba5620bfcdfdeb9c53 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"lightning-flow-scanner-core@workspace:.": + version: 0.0.0-use.local + resolution: "lightning-flow-scanner-core@workspace:." + dependencies: + "@types/chai": "npm:^4.2.21" + "@types/jsforce": "npm:^1.11.0" + "@types/mocha": "npm:^9.0.0" + "@types/node": "npm:^20.4.5" + chai: "npm:^4.3.4" + global: "npm:^4.4.0" + logging: "npm:^3.3.0" + mocha: "npm:^9.1.1" + ts-node: "npm:^10.2.1" + tslint: "npm:^6.1.3" + typescript: "npm:^4.3.4" + languageName: unknown + linkType: soft + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"log-symbols@npm:4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 + languageName: node + linkType: hard + +"logging@npm:^3.3.0": + version: 3.3.0 + resolution: "logging@npm:3.3.0" + dependencies: + chalk: "npm:^4.1.0" + debug: "npm:^4.3.1" + nicely-format: "npm:^1.1.0" + checksum: 10c0/a8c50f32c008c7cb76eb82c1217735d503f186d2725c3155fc2660f0ed0707f6ec660dd4c834eba14ea542c11809793ce327b034b944a911380a2ffd2fbffc9c + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.2.0 + resolution: "lru-cache@npm:10.2.0" + checksum: 10c0/c9847612aa2daaef102d30542a8d6d9b2c2bb36581c1bf0dc3ebf5e5f3352c772a749e604afae2e46873b930a9e9523743faac4e5b937c576ab29196774712ee + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 10c0/43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 + languageName: node + linkType: hard + +"min-document@npm:^2.19.0": + version: 2.19.0 + resolution: "min-document@npm:2.19.0" + dependencies: + dom-walk: "npm:^0.1.0" + checksum: 10c0/783724da716fc73a51c171865d7b29bf2b855518573f82ef61c40d214f6898d7b91b5c5419e4d22693cdb78d4615873ebc3b37d7639d3dd00ca283e5a07c7af9 + languageName: node + linkType: hard + +"minimatch@npm:4.2.1": + version: 4.2.1 + resolution: "minimatch@npm:4.2.1" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/a2381bc5fc4f4290b6659b01ba0e492d369fbf890c8eef828a9b17bbaa46bb0853db0709e436abfbe6e45620cbe191e9f9bc1dcf86d19de491b68e37c079a51c + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + languageName: node + linkType: hard + +"minimist@npm:^1.2.5": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 10c0/6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.3": + version: 0.5.5 + resolution: "mkdirp@npm:0.5.5" + dependencies: + minimist: "npm:^1.2.5" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/4469faeeba703bc46b7cdbe3097d6373747a581eb8b556ce41c8fd25a826eb3254466c6522ba823c2edb0b6f0da7beb91cf71f040bc4e361534a3e67f0994bd0 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"mocha@npm:^9.1.1": + version: 9.2.2 + resolution: "mocha@npm:9.2.2" + dependencies: + "@ungap/promise-all-settled": "npm:1.1.2" + ansi-colors: "npm:4.1.1" + browser-stdout: "npm:1.3.1" + chokidar: "npm:3.5.3" + debug: "npm:4.3.3" + diff: "npm:5.0.0" + escape-string-regexp: "npm:4.0.0" + find-up: "npm:5.0.0" + glob: "npm:7.2.0" + growl: "npm:1.10.5" + he: "npm:1.2.0" + js-yaml: "npm:4.1.0" + log-symbols: "npm:4.1.0" + minimatch: "npm:4.2.1" + ms: "npm:2.1.3" + nanoid: "npm:3.3.1" + serialize-javascript: "npm:6.0.0" + strip-json-comments: "npm:3.1.1" + supports-color: "npm:8.1.1" + which: "npm:2.0.2" + workerpool: "npm:6.2.0" + yargs: "npm:16.2.0" + yargs-parser: "npm:20.2.4" + yargs-unparser: "npm:2.0.0" + bin: + _mocha: bin/_mocha + mocha: bin/mocha + checksum: 10c0/eabc92c7d8fd5fe4a70b52bc88b902f8f640728e0985fabc5b25ca22f1f97b7b791c904150c4518003f705310d7f739392e9fdc53162a69372e6620511210e79 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + languageName: node + linkType: hard + +"ms@npm:2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"nanoid@npm:3.3.1": + version: 3.3.1 + resolution: "nanoid@npm:3.3.1" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/1034d71e438490e620bfc2419bb203e7dccbc122fd2e62a6101227b50d08992fdc114de197e77604c419dbcf4f41b142e6ff61d0516db4d24cd32f9bbc390f6b + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"nicely-format@npm:^1.1.0": + version: 1.1.0 + resolution: "nicely-format@npm:1.1.0" + dependencies: + ansi-styles: "npm:^2.2.1" + esutils: "npm:^2.0.2" + checksum: 10c0/fcf46a472af60d894be98083b1ec28e647295ba48a7ea1c566e713f1adf2c1994e2c3440f9d89c1242fa256c553d2fa2ce6cf1d6966a6610e0ef9ef4e93f4340 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/abddfff7d873312e4ed4a5fb75ce893a5c4fb69e7fcb1dfa71c28a6b92a7f1ef6b62790dffb39181b5a82728ba8f2f32d229cf8cbe66769fe02cea7db4a555aa + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-parse@npm:^1.0.6": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: "npm:^9.1.1 || ^10.0.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e + languageName: node + linkType: hard + +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 10c0/f63e1bc1b33593cdf094ed6ff5c49c1c0dc5dc20a646ca9725cc7fe7cd9995002d51d5685b9b2ec6814342935748b711bafa840f84c0bb04e38ff40a335c94dc + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"resolve@npm:^1.3.2": + version: 1.20.0 + resolution: "resolve@npm:1.20.0" + dependencies: + is-core-module: "npm:^2.2.0" + path-parse: "npm:^1.0.6" + checksum: 10c0/d2c99e3bfbfd1f5aa4d134fa893b0157b923d6bfdc36563cb126995982ebfd0d93d901f851e4577897580f7c87d9a62d307b811422009fd3d2a8ed0571c2eabb + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.3.2#optional!builtin": + version: 1.20.0 + resolution: "resolve@patch:resolve@npm%3A1.20.0#optional!builtin::version=1.20.0&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.2.0" + path-parse: "npm:^1.0.6" + checksum: 10c0/b6a5345d1f015cebba11dffa6a1982b39fe9ef42ed86ed832e51bd01c10817666df6d7b11579bc88664f5d57f2a5fe073a7f46b4e72a3efe7ed0cb450ee786da + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"safe-buffer@npm:^5.1.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"semver@npm:^5.3.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + +"semver@npm:^7.3.5": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 10c0/fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53 + languageName: node + linkType: hard + +"serialize-javascript@npm:6.0.0": + version: 6.0.0 + resolution: "serialize-javascript@npm:6.0.0" + dependencies: + randombytes: "npm:^2.1.0" + checksum: 10c0/73104922ef0a919064346eea21caab99de1a019a1f5fb54a7daa7fcabc39e83b387a2a363e52a889598c3b1bcf507c4b2a7b26df76e991a310657af20eea2e7c + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: 10c0/a842402fc9b8848a31367f2811ca3cd14c4106588b39a0901cd7a69029998adfc6456b0203617c18ed090542ad0c24ee4e9d4c75a0c4b75071e214227c177eb7 + languageName: node + linkType: hard + +"socks@npm:^2.7.1": + version: 2.8.1 + resolution: "socks@npm:2.8.1" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/ac77b515c260473cc7c4452f09b20939e22510ce3ae48385c516d1d5784374d5cc75be3cb18ff66cc985a7f4f2ef8fef84e984c5ec70aad58355ed59241f40a8 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-json-comments@npm:3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"supports-color@npm:8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.0 + resolution: "tar@npm:6.2.0" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10c0/02ca064a1a6b4521fef88c07d389ac0936730091f8c02d30ea60d472e0378768e870769ab9e986d87807bfee5654359cf29ff4372746cc65e30cbddc352660d8 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"ts-node@npm:^10.2.1": + version: 10.2.1 + resolution: "ts-node@npm:10.2.1" + dependencies: + "@cspotcode/source-map-support": "npm:0.6.1" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 10c0/15755a09a97797036aed3672a9551a441958271c3e77a99714b41db3fcfc5829ae22aac3365d48bcf94f88a78c5cc8e3e2cd13240d948d19b7aa1a47f210bfe3 + languageName: node + linkType: hard + +"tslib@npm:^1.13.0, tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 + languageName: node + linkType: hard + +"tslint@npm:^6.1.3": + version: 6.1.3 + resolution: "tslint@npm:6.1.3" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + builtin-modules: "npm:^1.1.1" + chalk: "npm:^2.3.0" + commander: "npm:^2.12.1" + diff: "npm:^4.0.1" + glob: "npm:^7.1.1" + js-yaml: "npm:^3.13.1" + minimatch: "npm:^3.0.4" + mkdirp: "npm:^0.5.3" + resolve: "npm:^1.3.2" + semver: "npm:^5.3.0" + tslib: "npm:^1.13.0" + tsutils: "npm:^2.29.0" + peerDependencies: + typescript: ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + bin: + tslint: bin/tslint + checksum: 10c0/04717de06d187ee46ffa99e28af80f1b5a2edbec051e32b43ca681da625a61e94e5eb9ebb638fafe07975fb3536760ffd772f76c57134db723a9ecff6aeac380 + languageName: node + linkType: hard + +"tsutils@npm:^2.29.0": + version: 2.29.0 + resolution: "tsutils@npm:2.29.0" + dependencies: + tslib: "npm:^1.8.1" + peerDependencies: + typescript: ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + checksum: 10c0/e37794513526dbf1cf960414d0a65b956ad319dbc93171bccfe08e3fece1eea35b4e130153f41d917a0f28ecac04f3ca78e9a99c4bddc64a5f225925abc0cf14 + languageName: node + linkType: hard + +"type-detect@npm:^4.0.0, type-detect@npm:^4.0.5": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd + languageName: node + linkType: hard + +"typescript@npm:^4.3.4": + version: 4.3.4 + resolution: "typescript@npm:4.3.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/05e116885c639a9bdbd65ad4020c8954f619c02124c6db79d3d36a360e7a9399472844936beee005fe623dfaab2123aeb12e332b53e388d2fd15296abad1143f + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^4.3.4#optional!builtin": + version: 4.3.4 + resolution: "typescript@patch:typescript@npm%3A4.3.4#optional!builtin::version=4.3.4&hash=dba6d9" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/90273a7286e851fcf44a33ceaadd50b56463efeded329274b04f25b332ae6501d2e21700cb12bda7425c0c2708f1cd08186c936b4d493f82df4352340f9bdb06 + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + +"which@npm:2.0.2, which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + +"workerpool@npm:6.2.0": + version: 6.2.0 + resolution: "workerpool@npm:6.2.0" + checksum: 10c0/67821b2d1d9e493ba0c395a458fbd3090be97943f98826bdb7b3ca4b9480caea1659c2c0c44c4edd6178ed89919eef598c687c9c81639d8217e913c52d3fff1b + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yargs-parser@npm:20.2.4": + version: 20.2.4 + resolution: "yargs-parser@npm:20.2.4" + checksum: 10c0/08dc341f0b9f940c2fffc1d1decf3be00e28cabd2b578a694901eccc7dcd10577f10c6aa1b040fdd9a68b2042515a60f18476543bccacf9f3ce2c8534cd87435 + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 + languageName: node + linkType: hard + +"yargs-unparser@npm:2.0.0": + version: 2.0.0 + resolution: "yargs-unparser@npm:2.0.0" + dependencies: + camelcase: "npm:^6.0.0" + decamelize: "npm:^4.0.0" + flat: "npm:^5.0.2" + is-plain-obj: "npm:^2.1.0" + checksum: 10c0/a5a7d6dc157efa95122e16780c019f40ed91d4af6d2bac066db8194ed0ec5c330abb115daa5a79ff07a9b80b8ea80c925baacf354c4c12edd878c0529927ff03 + languageName: node + linkType: hard + +"yargs@npm:16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard From 523f43cb2a4e08168f1fca4f03893ef54be68272 Mon Sep 17 00:00:00 2001 From: Ruben Date: Thu, 7 Mar 2024 18:29:39 +0100 Subject: [PATCH 13/15] rm td --- tests/errorinloop.test.ts | 19 - tests/testfiles/inlooperror.json | 1529 ------------------------------ 2 files changed, 1548 deletions(-) delete mode 100644 tests/errorinloop.test.ts delete mode 100644 tests/testfiles/inlooperror.json diff --git a/tests/errorinloop.test.ts b/tests/errorinloop.test.ts deleted file mode 100644 index 0e05adb..0000000 --- a/tests/errorinloop.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { assert, expect } from 'chai'; -import 'mocha'; -import * as core from '../src'; -import inlooperror from './testfiles/inlooperror.json'; - -describe('SOQLQueryInLoop ERROR ', () => { - let flow: core.Flow; - - it(' should not occur', () => { - - flow = new core.Flow({ - path: 'anypath', - xmldata: inlooperror, - }); - const results: core.ScanResult[] = core.scan([flow]); - console.log(results); - }); - -}); diff --git a/tests/testfiles/inlooperror.json b/tests/testfiles/inlooperror.json deleted file mode 100644 index 6309ef7..0000000 --- a/tests/testfiles/inlooperror.json +++ /dev/null @@ -1,1529 +0,0 @@ -{ - "Flow": { - "$": { - "xmlns": "http://soap.sforce.com/2006/04/metadata" - }, - "apiVersion": [ - "60.0" - ], - "assignments": [ - { - "name": [ - "Assign_LIGHT" - ], - "label": [ - "Assign_LIGHT" - ], - "locationX": [ - "402" - ], - "locationY": [ - "890" - ], - "assignmentItems": [ - { - "assignToReference": [ - "LightType_ID" - ], - "operator": [ - "Assign" - ], - "value": [ - { - "elementReference": [ - "Loop_RType.Id" - ] - } - ] - } - ], - "connector": [ - { - "targetReference": [ - "Loop_RType" - ] - } - ] - }, - { - "name": [ - "AssignFull" - ], - "label": [ - "Assign_Full" - ], - "locationX": [ - "138" - ], - "locationY": [ - "890" - ], - "assignmentItems": [ - { - "assignToReference": [ - "FullType_ID" - ], - "operator": [ - "Assign" - ], - "value": [ - { - "elementReference": [ - "Loop_RType.Id" - ] - } - ] - } - ], - "connector": [ - { - "targetReference": [ - "Loop_RType" - ] - } - ] - }, - { - "name": [ - "AssignRTValid" - ], - "label": [ - "Assign RType Valid" - ], - "locationX": [ - "138" - ], - "locationY": [ - "1490" - ], - "assignmentItems": [ - { - "assignToReference": [ - "GoNoGoType" - ], - "operator": [ - "Assign" - ], - "value": [ - { - "elementReference": [ - "RTEligible.CRM_GoNoGoType__c" - ] - } - ] - } - ], - "connector": [ - { - "targetReference": [ - "RTEligible" - ] - } - ] - } - ], - "choices": [ - { - "description": [ - "RecordType GonogoReview" - ], - "name": [ - "FullType_Label" - ], - "choiceText": [ - "{!$Label.CRM_GoNoGoReviewFullRType}" - ], - "dataType": [ - "String" - ], - "value": [ - { - "elementReference": [ - "FullType_ID" - ] - } - ] - }, - { - "name": [ - "LightType_Label" - ], - "choiceText": [ - "{!$Label.CRM_GoNoGoReviewLightRType}" - ], - "dataType": [ - "String" - ], - "value": [ - { - "elementReference": [ - "LightType_ID" - ] - } - ] - } - ], - "decisions": [ - { - "name": [ - "Dec_HasEditAccess" - ], - "label": [ - "Has Edit Access ?" - ], - "locationX": [ - "776" - ], - "locationY": [ - "242" - ], - "defaultConnector": [ - { - "targetReference": [ - "Screen_NoEditAccess" - ] - } - ], - "defaultConnectorLabel": [ - "Default Outcome" - ], - "rules": [ - { - "name": [ - "Out_EditAccess_Yes" - ], - "conditionLogic": [ - "and" - ], - "conditions": [ - { - "leftValueReference": [ - "Get_UserRecordAccess.varR_UserRecordAccessSingle.HasEditAccess" - ], - "operator": [ - "EqualTo" - ], - "rightValue": [ - { - "booleanValue": [ - "true" - ] - } - ] - } - ], - "connector": [ - { - "targetReference": [ - "GetOpportunity" - ] - } - ], - "label": [ - "Yes" - ] - } - ] - }, - { - "name": [ - "Decision_Amount" - ], - "label": [ - "Decision Amount" - ], - "locationX": [ - "270" - ], - "locationY": [ - "1382" - ], - "defaultConnector": [ - { - "targetReference": [ - "RTEligible" - ] - } - ], - "defaultConnectorLabel": [ - "Not Greater" - ], - "rules": [ - { - "name": [ - "AmmountGreaterOrEqual" - ], - "conditionLogic": [ - "and" - ], - "conditions": [ - { - "leftValueReference": [ - "GetOpportunity.Amount" - ], - "operator": [ - "GreaterThanOrEqualTo" - ], - "rightValue": [ - { - "elementReference": [ - "RTEligible.CRM_ThresholdAmount__c" - ] - } - ] - } - ], - "connector": [ - { - "targetReference": [ - "AssignRTValid" - ] - } - ], - "label": [ - "Greater or Equal" - ] - } - ] - }, - { - "name": [ - "Decision_NewGoNoGo" - ], - "label": [ - "Decision_NewGoNoGo" - ], - "locationX": [ - "446" - ], - "locationY": [ - "458" - ], - "defaultConnectorLabel": [ - "Default Outcome" - ], - "rules": [ - { - "name": [ - "True" - ], - "conditionLogic": [ - "and" - ], - "conditions": [ - { - "leftValueReference": [ - "GetOpportunity.CRM_GoNoGoReview__c" - ], - "operator": [ - "IsNull" - ], - "rightValue": [ - { - "booleanValue": [ - "true" - ] - } - ] - } - ], - "connector": [ - { - "targetReference": [ - "Get_RecordType" - ] - } - ], - "label": [ - "True" - ] - } - ] - }, - { - "name": [ - "Decision_RType" - ], - "label": [ - "Decision_RType" - ], - "locationX": [ - "402" - ], - "locationY": [ - "782" - ], - "defaultConnector": [ - { - "targetReference": [ - "Loop_RType" - ] - } - ], - "defaultConnectorLabel": [ - "Default Outcome" - ], - "rules": [ - { - "name": [ - "Decision_FULL" - ], - "conditionLogic": [ - "and" - ], - "conditions": [ - { - "leftValueReference": [ - "Loop_RType.DeveloperName" - ], - "operator": [ - "EqualTo" - ], - "rightValue": [ - { - "stringValue": [ - "CRM_GoNoGoFullVersion" - ] - } - ] - } - ], - "connector": [ - { - "targetReference": [ - "AssignFull" - ] - } - ], - "label": [ - "FULL" - ] - }, - { - "name": [ - "Decision_LIGHT" - ], - "conditionLogic": [ - "and" - ], - "conditions": [ - { - "leftValueReference": [ - "Loop_RType.DeveloperName" - ], - "operator": [ - "EqualTo" - ], - "rightValue": [ - { - "stringValue": [ - "CRM_GoNoGoLightVersion" - ] - } - ] - } - ], - "connector": [ - { - "targetReference": [ - "Assign_LIGHT" - ] - } - ], - "label": [ - "LIGHT" - ] - } - ] - } - ], - "description": [ - "Create a Go / No Go Review and update Opportunity" - ], - "environments": [ - "Default" - ], - "formulas": [ - { - "name": [ - "RTSelected" - ], - "dataType": [ - "String" - ], - "expression": [ - "IF({!GoNoGoType} == 'LIGHT', {!Screen_All}, {!Srceen_Full})" - ] - } - ], - "interviewLabel": [ - "CRM_Opportunity_NewGoNoGoReview {!$Flow.CurrentDateTime}" - ], - "label": [ - "CRM_Opportunity_NewGoNoGoReview" - ], - "loops": [ - { - "description": [ - "Build record type choice ( custom label and rtype id)" - ], - "name": [ - "Loop_RType" - ], - "label": [ - "Loop_RType" - ], - "locationX": [ - "50" - ], - "locationY": [ - "674" - ], - "collectionReference": [ - "Get_RecordType" - ], - "iterationOrder": [ - "Asc" - ], - "nextValueConnector": [ - { - "targetReference": [ - "Decision_RType" - ] - } - ], - "noMoreValuesConnector": [ - { - "targetReference": [ - "Get_MetaDataType" - ] - } - ] - }, - { - "name": [ - "RTEligible" - ], - "label": [ - "RType Eligible" - ], - "locationX": [ - "50" - ], - "locationY": [ - "1274" - ], - "collectionReference": [ - "Get_MetaDataType" - ], - "iterationOrder": [ - "Asc" - ], - "nextValueConnector": [ - { - "targetReference": [ - "Decision_Amount" - ] - } - ], - "noMoreValuesConnector": [ - { - "targetReference": [ - "New_Go_No_Go_Review" - ] - } - ] - } - ], - "processMetadataValues": [ - { - "name": [ - "BuilderType" - ], - "value": [ - { - "stringValue": [ - "LightningFlowBuilder" - ] - } - ] - }, - { - "name": [ - "CanvasMode" - ], - "value": [ - { - "stringValue": [ - "AUTO_LAYOUT_CANVAS" - ] - } - ] - }, - { - "name": [ - "OriginBuilderType" - ], - "value": [ - { - "stringValue": [ - "LightningFlowBuilder" - ] - } - ] - } - ], - "processType": [ - "Flow" - ], - "recordCreates": [ - { - "name": [ - "Create_GoNoGoReview" - ], - "label": [ - "Create GoNoGoReview" - ], - "locationX": [ - "50" - ], - "locationY": [ - "1874" - ], - "assignRecordIdToReference": [ - "GoNoGoID" - ], - "connector": [ - { - "targetReference": [ - "Update_Opportunity" - ] - } - ], - "faultConnector": [ - { - "targetReference": [ - "Parse_Flow_Fault_Error" - ] - } - ], - "inputAssignments": [ - { - "field": [ - "CRM_EstimatedAmount__c" - ], - "value": [ - { - "elementReference": [ - "cEstimatedAmount" - ] - } - ] - }, - { - "field": [ - "CRM_Opportunity__c" - ], - "value": [ - { - "elementReference": [ - "recordId" - ] - } - ] - }, - { - "field": [ - "RecordTypeId" - ], - "value": [ - { - "elementReference": [ - "RTSelected" - ] - } - ] - } - ], - "object": [ - "CRM_GoNoGoReview__c" - ] - } - ], - "recordLookups": [ - { - "name": [ - "Get_MetaDataType" - ], - "label": [ - "Get MetaDataType" - ], - "locationX": [ - "50" - ], - "locationY": [ - "1166" - ], - "assignNullValuesIfNoRecordsFound": [ - "false" - ], - "connector": [ - { - "targetReference": [ - "RTEligible" - ] - } - ], - "filterLogic": [ - "and" - ], - "filters": [ - { - "field": [ - "CRM_EngagementLevel__c" - ], - "operator": [ - "EqualTo" - ], - "value": [ - { - "elementReference": [ - "GetOpportunity.CRM_EngagementLevel__c" - ] - } - ] - }, - { - "field": [ - "CRM_Country__c" - ], - "operator": [ - "EqualTo" - ], - "value": [ - { - "elementReference": [ - "GetOpportunity.CRM_LegalEntityAddress__CountryCode__s" - ] - } - ] - } - ], - "getFirstRecordOnly": [ - "false" - ], - "object": [ - "CRM_GoNoGoCriteria__mdt" - ], - "sortField": [ - "CRM_ThresholdAmount__c" - ], - "sortOrder": [ - "Asc" - ], - "storeOutputAutomatically": [ - "true" - ] - }, - { - "name": [ - "Get_RecordType" - ], - "label": [ - "Get RecordType" - ], - "locationX": [ - "50" - ], - "locationY": [ - "566" - ], - "assignNullValuesIfNoRecordsFound": [ - "false" - ], - "connector": [ - { - "targetReference": [ - "Loop_RType" - ] - } - ], - "filterLogic": [ - "and" - ], - "filters": [ - { - "field": [ - "SobjectType" - ], - "operator": [ - "EqualTo" - ], - "value": [ - { - "stringValue": [ - "CRM_GoNoGoReview__c" - ] - } - ] - } - ], - "getFirstRecordOnly": [ - "false" - ], - "object": [ - "RecordType" - ], - "storeOutputAutomatically": [ - "true" - ] - }, - { - "name": [ - "GetOpportunity" - ], - "label": [ - "Get Opportunity" - ], - "locationX": [ - "446" - ], - "locationY": [ - "350" - ], - "assignNullValuesIfNoRecordsFound": [ - "false" - ], - "connector": [ - { - "targetReference": [ - "Decision_NewGoNoGo" - ] - } - ], - "filterLogic": [ - "and" - ], - "filters": [ - { - "field": [ - "Id" - ], - "operator": [ - "EqualTo" - ], - "value": [ - { - "elementReference": [ - "recordId" - ] - } - ] - } - ], - "getFirstRecordOnly": [ - "true" - ], - "object": [ - "Opportunity" - ], - "queriedFields": [ - "Id", - "Name", - "Amount", - "AccountId", - "CRM_OpportunityNumber__c", - "CurrencyIsoCode", - "CRM_EngagementLevel__c", - "CRM_GoNoGoReview__c", - "CRM_LegalEntityAddress__CountryCode__s" - ], - "storeOutputAutomatically": [ - "true" - ] - } - ], - "recordUpdates": [ - { - "name": [ - "Update_Opportunity" - ], - "label": [ - "Update_Opportunity" - ], - "locationX": [ - "50" - ], - "locationY": [ - "1982" - ], - "connector": [ - { - "targetReference": [ - "Screen_Redirect" - ] - } - ], - "faultConnector": [ - { - "isGoTo": [ - "true" - ], - "targetReference": [ - "Parse_Flow_Fault_Error" - ] - } - ], - "filterLogic": [ - "and" - ], - "filters": [ - { - "field": [ - "Id" - ], - "operator": [ - "EqualTo" - ], - "value": [ - { - "elementReference": [ - "recordId" - ] - } - ] - } - ], - "inputAssignments": [ - { - "field": [ - "CRM_GoNoGoReview__c" - ], - "value": [ - { - "elementReference": [ - "GoNoGoID" - ] - } - ] - } - ], - "object": [ - "Opportunity" - ] - } - ], - "runInMode": [ - "SystemModeWithoutSharing" - ], - "screens": [ - { - "name": [ - "New_Go_No_Go_Review" - ], - "label": [ - "New Go / No Go Review" - ], - "locationX": [ - "50" - ], - "locationY": [ - "1766" - ], - "allowBack": [ - "true" - ], - "allowFinish": [ - "true" - ], - "allowPause": [ - "true" - ], - "connector": [ - { - "targetReference": [ - "Create_GoNoGoReview" - ] - } - ], - "fields": [ - { - "name": [ - "Screen_Opportunity" - ], - "fieldText": [ - "

Opportunity

{!GetOpportunity.CRM_OpportunityNumber__c} - {!GetOpportunity.Name}

" - ], - "fieldType": [ - "DisplayText" - ] - }, - { - "name": [ - "cEstimatedAmount" - ], - "dataType": [ - "Currency" - ], - "defaultValue": [ - { - "elementReference": [ - "GetOpportunity.Amount" - ] - } - ], - "fieldText": [ - "Estimated Amount" - ], - "fieldType": [ - "InputField" - ], - "inputsOnNextNavToAssocScrn": [ - "UseStoredValues" - ], - "isRequired": [ - "true" - ], - "scale": [ - "2" - ] - }, - { - "name": [ - "New_Go_No_Go_Review_Section1" - ], - "fieldType": [ - "RegionContainer" - ], - "fields": [ - { - "name": [ - "New_Go_No_Go_Review_Section1_Column1" - ], - "fieldType": [ - "Region" - ], - "fields": [ - { - "name": [ - "Srceen_Full" - ], - "choiceReferences": [ - "FullType_Label" - ], - "dataType": [ - "String" - ], - "defaultSelectedChoiceReference": [ - "FullType_Label" - ], - "fieldText": [ - "Type de Go / No Go" - ], - "fieldType": [ - "RadioButtons" - ], - "inputsOnNextNavToAssocScrn": [ - "UseStoredValues" - ], - "isRequired": [ - "true" - ], - "visibilityRule": [ - { - "conditionLogic": [ - "and" - ], - "conditions": [ - { - "leftValueReference": [ - "GoNoGoType" - ], - "operator": [ - "EqualTo" - ], - "rightValue": [ - { - "stringValue": [ - "FULL" - ] - } - ] - } - ] - } - ] - }, - { - "name": [ - "Screen_All" - ], - "choiceReferences": [ - "LightType_Label", - "FullType_Label" - ], - "dataType": [ - "String" - ], - "defaultSelectedChoiceReference": [ - "LightType_Label" - ], - "fieldText": [ - "Type de Go / No Go" - ], - "fieldType": [ - "RadioButtons" - ], - "inputsOnNextNavToAssocScrn": [ - "UseStoredValues" - ], - "isRequired": [ - "true" - ], - "visibilityRule": [ - { - "conditionLogic": [ - "and" - ], - "conditions": [ - { - "leftValueReference": [ - "GoNoGoType" - ], - "operator": [ - "EqualTo" - ], - "rightValue": [ - { - "stringValue": [ - "LIGHT" - ] - } - ] - } - ] - } - ] - } - ], - "inputParameters": [ - { - "name": [ - "width" - ], - "value": [ - { - "stringValue": [ - "6" - ] - } - ] - } - ], - "isRequired": [ - "false" - ] - }, - { - "name": [ - "New_Go_No_Go_Review_Section1_Column2" - ], - "fieldType": [ - "Region" - ], - "inputParameters": [ - { - "name": [ - "width" - ], - "value": [ - { - "stringValue": [ - "6" - ] - } - ] - } - ], - "isRequired": [ - "false" - ] - } - ], - "isRequired": [ - "false" - ], - "regionContainerType": [ - "SectionWithoutHeader" - ] - } - ], - "showFooter": [ - "true" - ], - "showHeader": [ - "true" - ] - }, - { - "name": [ - "scr_ShowFaultError" - ], - "label": [ - "scr_ShowFaultError" - ], - "locationX": [ - "578" - ], - "locationY": [ - "2090" - ], - "allowBack": [ - "true" - ], - "allowFinish": [ - "true" - ], - "allowPause": [ - "true" - ], - "fields": [ - { - "name": [ - "dis_Error" - ], - "fieldText": [ - "

The following error occurred:

{!Parse_Flow_Fault_Error.varT_OutputParsedFaultMessage}


If you need further assistance, please don't hesitate to reach out to your Admin.

" - ], - "fieldType": [ - "DisplayText" - ] - } - ], - "showFooter": [ - "true" - ], - "showHeader": [ - "true" - ] - }, - { - "name": [ - "Screen_NoEditAccess" - ], - "label": [ - "Edit Access" - ], - "locationX": [ - "1106" - ], - "locationY": [ - "350" - ], - "allowBack": [ - "true" - ], - "allowFinish": [ - "true" - ], - "allowPause": [ - "true" - ], - "fields": [ - { - "name": [ - "DText_NoEditAccess" - ], - "fieldText": [ - "

{!$Label.CRM_NoEditAccess}

" - ], - "fieldType": [ - "DisplayText" - ] - } - ], - "showFooter": [ - "true" - ], - "showHeader": [ - "true" - ] - }, - { - "name": [ - "Screen_Redirect" - ], - "label": [ - "Screen_Redirect" - ], - "locationX": [ - "50" - ], - "locationY": [ - "2090" - ], - "allowBack": [ - "true" - ], - "allowFinish": [ - "true" - ], - "allowPause": [ - "true" - ], - "fields": [ - { - "name": [ - "Redirect" - ], - "extensionName": [ - "c:crm_redirectToRecordFlow" - ], - "fieldType": [ - "ComponentInstance" - ], - "inputParameters": [ - { - "name": [ - "recordId" - ], - "value": [ - { - "elementReference": [ - "GoNoGoID" - ] - } - ] - } - ], - "inputsOnNextNavToAssocScrn": [ - "UseStoredValues" - ], - "isRequired": [ - "true" - ], - "storeOutputAutomatically": [ - "true" - ] - } - ], - "showFooter": [ - "false" - ], - "showHeader": [ - "false" - ] - } - ], - "start": [ - { - "locationX": [ - "650" - ], - "locationY": [ - "0" - ], - "connector": [ - { - "targetReference": [ - "Get_UserRecordAccess" - ] - } - ] - } - ], - "status": [ - "Active" - ], - "subflows": [ - { - "name": [ - "Get_UserRecordAccess" - ], - "label": [ - "Get UserRecordAccess" - ], - "locationX": [ - "776" - ], - "locationY": [ - "134" - ], - "connector": [ - { - "targetReference": [ - "Dec_HasEditAccess" - ] - } - ], - "flowName": [ - "CRM_GetUserRecordAccess" - ], - "inputAssignments": [ - { - "name": [ - "varT_InputSingleRecordId" - ], - "value": [ - { - "elementReference": [ - "recordId" - ] - } - ] - }, - { - "name": [ - "varT_UserId" - ], - "value": [ - { - "elementReference": [ - "$User.Id" - ] - } - ] - } - ], - "storeOutputAutomatically": [ - "true" - ] - }, - { - "name": [ - "Parse_Flow_Fault_Error" - ], - "label": [ - "Parse Flow Fault Error" - ], - "locationX": [ - "578" - ], - "locationY": [ - "1982" - ], - "connector": [ - { - "targetReference": [ - "scr_ShowFaultError" - ] - } - ], - "flowName": [ - "G_ParseFlowFaultMessage" - ], - "inputAssignments": [ - { - "name": [ - "varT_InputFaultMessage" - ], - "value": [ - { - "elementReference": [ - "$Flow.FaultMessage" - ] - } - ] - } - ], - "storeOutputAutomatically": [ - "true" - ] - } - ], - "variables": [ - { - "name": [ - "FullType_ID" - ], - "dataType": [ - "String" - ], - "isCollection": [ - "false" - ], - "isInput": [ - "false" - ], - "isOutput": [ - "false" - ] - }, - { - "name": [ - "GoNoGoID" - ], - "dataType": [ - "String" - ], - "isCollection": [ - "false" - ], - "isInput": [ - "false" - ], - "isOutput": [ - "false" - ] - }, - { - "name": [ - "GoNoGoType" - ], - "dataType": [ - "String" - ], - "isCollection": [ - "false" - ], - "isInput": [ - "false" - ], - "isOutput": [ - "false" - ], - "value": [ - { - "stringValue": [ - "LIGHT" - ] - } - ] - }, - { - "name": [ - "LightType_ID" - ], - "dataType": [ - "String" - ], - "isCollection": [ - "false" - ], - "isInput": [ - "false" - ], - "isOutput": [ - "false" - ] - }, - { - "name": [ - "recordId" - ], - "dataType": [ - "String" - ], - "isCollection": [ - "false" - ], - "isInput": [ - "true" - ], - "isOutput": [ - "false" - ] - } - ] - } -} \ No newline at end of file From cfbe451aadd21a22f4eab699e0d0b43d3936d74c Mon Sep 17 00:00:00 2001 From: Ruben Date: Thu, 7 Mar 2024 18:44:22 +0100 Subject: [PATCH 14/15] readd the loader --- src/main/libs/GetRuleDefinitions.ts | 7 +++---- src/main/libs/RuleLoader.ts | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/libs/GetRuleDefinitions.ts b/src/main/libs/GetRuleDefinitions.ts index 726d4c0..f437914 100644 --- a/src/main/libs/GetRuleDefinitions.ts +++ b/src/main/libs/GetRuleDefinitions.ts @@ -16,10 +16,9 @@ export function GetRuleDefinitions(ruleConfig?: Map): IRuleDefinitio } if(configuredPath){ - // TODO CR - // let customRule = RuleLoader.loadCustomRule(configuredPath); - // selectedRules['severity'] = severity; - // selectedRules.push(customRule); + let customRule = RuleLoader.loadCustomRule(configuredPath); + selectedRules['severity'] = severity; + selectedRules.push(customRule); } else { const matchedRule = new DynamicRule(ruleName); matchedRule['severity'] = severity; diff --git a/src/main/libs/RuleLoader.ts b/src/main/libs/RuleLoader.ts index 6569297..8594ce9 100644 --- a/src/main/libs/RuleLoader.ts +++ b/src/main/libs/RuleLoader.ts @@ -9,6 +9,5 @@ export class RuleLoader { const externalRule: any = require(filePath); const customRuleInstance = new externalRule() as IRuleDefinition; return customRuleInstance; - } } \ No newline at end of file From b98c0e03d71ce6e6fbe3ed3730d8d1f11501de97 Mon Sep 17 00:00:00 2001 From: Ruben Date: Thu, 7 Mar 2024 18:53:03 +0100 Subject: [PATCH 15/15] v2.28.0 --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9bdc517..6ce6430 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lightning-flow-scanner-core", - "version": "2.27.0", + "version": "2.28.0", "main": "out/**", "types": "out/index.d.ts", "scripts": { @@ -26,5 +26,6 @@ "devDependencies": { "@types/jsforce": "^1.11.0", "@types/mocha": "^9.0.0" - } + }, + "packageManager": "yarn@4.1.1" }