Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:

workflows:
version: 2
"flowhealthcheck-cli":
"lightningflowscan-cli":
jobs:
- node-latest
- node-8
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
flowhealthcheck-cli
lightningflowscan-cli
===================

<!-- install -->
Expand All @@ -8,7 +8,7 @@ $ npm install -g lightningflowscan-cli
$ sfdx COMMAND
running command...
$ sfdx (-v|--version|version)
lightningflowscan-cli/0.0.5 darwin-x64 node-v14.16.1
lightningflowscan-cli/0.0.8 darwin-x64 node-v14.16.1
$ sfdx --help [COMMAND]
USAGE
$ sfdx COMMAND
Expand All @@ -20,7 +20,7 @@ $ npm install -g lightningflowscan-cli
$ sfdx hello:lint
running command...
$ sfdx (-v|--version|version)
flowhealthcheck-cli/0.0.0 darwin-x64 node-v16.1.0
lightningflowscan-cli/0.0.0 darwin-x64 node-v16.1.0
$ sfdx --help [COMMAND]
USAGE
$ sfdx scan:flowscan
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "lightningflowscan-cli",
"version": "0.0.6",
"version": "0.0.8",
"author": "Ruben",
"bugs": "https://github.com/Force-Config-Control/lightningflowscan-cli/issues",
"dependencies": {
Expand Down
69 changes: 57 additions & 12 deletions src/commands/scan/flows.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import {SfdxCommand} from '@salesforce/command';
import {Messages, SfdxError, SfdxProject} from '@salesforce/core';
import {fs, Messages, SfdxError, SfdxProject} from '@salesforce/core';
import {AnyJson} from '@salesforce/ts-types';
import * as core from 'lightningflowscan-core/out';
import {Flow} from 'lightningflowscan-core/out/main/models/Flow';
import {ScanResult} from 'lightningflowscan-core/out/main/models/ScanResult';
import {Violation} from '../../models/Violation';
import {FindFlows} from "../../libs/FindFlows";
import {ParseFlows} from "../../libs/ParseFlows";
import * as path from 'path';
import {IgnoredFlowViolations} from "../../models/IgnoredFlowViolations";
import {IgnoredRuleViolationsInFlows} from "../../models/IgnoredRuleViolationsInFlows";

Messages.importMessagesDirectory(__dirname);

Expand All @@ -20,35 +23,77 @@ export default class flows extends SfdxCommand {
protected static supportsDevhubUsername = false;
protected static requiresProject = true;

public ignoredFlowViolations: IgnoredFlowViolations;
public ignoredRuleViolationsInFlows: IgnoredRuleViolationsInFlows;

public async run(): Promise<AnyJson> {

const path = await SfdxProject.resolveProjectPath();
const flowFiles = FindFlows(path);
const aPath = await SfdxProject.resolveProjectPath();
const flowFiles = FindFlows(aPath);

// todo ugly code
// if ignore file found, populate this.ignoredFlowViolations & this.ignoredRuleViolationsInFlows
const pathToIgnoreFile = path.join(aPath, 'flows.scanignore.json');
if(pathToIgnoreFile){
this.createIgnoreViolations(pathToIgnoreFile);
}

const parsedFlows: Flow[] = await ParseFlows(flowFiles);
const scanResults: ScanResult[] = core.scan(parsedFlows);
const lintResults: Violation[] = [];
for (const scanResult of scanResults) {
for (const ruleResult of scanResult.ruleResults) {
if (ruleResult.results.length > 0) {
lintResults.push(
new Violation(
scanResult.flow.label,
ruleResult.ruleLabel,
ruleResult.ruleDescription,
ruleResult.results.length
)
);
if (this.ignoredFlowViolations && this.ignoredFlowViolations.flowlabels.length > 0 && this.ignoredFlowViolations.flowlabels.find(violation => {
return (violation == scanResult.flow.label);
})) {
continue;
} else if (this.ignoredRuleViolationsInFlows && this.ignoredRuleViolationsInFlows.ignoredRuleViolationsInFlows.length > 0 && this.ignoredRuleViolationsInFlows.ignoredRuleViolationsInFlows.find(violation => {
if (violation && violation.flowname && violation.rulename) {
return (violation.flowname == scanResult.flow.label && violation.rulename == ruleResult.ruleLabel);
}
})) {
continue;
} else {
lintResults.push(
new Violation(
scanResult.flow.label,
ruleResult.ruleLabel,
ruleResult.ruleDescription,
ruleResult.results.length
)
);
}
}
}
}
if (lintResults.length > 0) {
const warnings: string[] = [];
for (const lintResult of lintResults) {
warnings.push('in Flow \'' + lintResult.label + '\', Rule:\'' + lintResult.ruleLabel + '\' is violated ' + lintResult.numberOfViolations + ' times');
warnings.push('in Flow \'' + lintResult.flowlabel + '\', Rule:\'' + lintResult.ruleLabel + '\' is violated ' + lintResult.numberOfViolations + ' times');
}
throw new SfdxError(messages.getMessage('commandDescription'), 'results', warnings, 1);
}
// If there are no lintresults
return 0;
}

private createIgnoreViolations(pathToIgnoreFile) {

let foundPath;
if (fs.existsSync(pathToIgnoreFile)) {
foundPath = fs.readJsonSync(pathToIgnoreFile);
}
try {
let ignoredFlows = foundPath['flowsToBeIgnored'];
this.ignoredFlowViolations = new IgnoredFlowViolations(ignoredFlows);
let ignoredRulesInFlows = foundPath['rulesToBeIgnoredInFlows'];
this.ignoredRuleViolationsInFlows = new IgnoredRuleViolationsInFlows(ignoredRulesInFlows);
} catch (e) {

}

return
}

}
1 change: 0 additions & 1 deletion src/libs/FindFlows.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,3 @@ export function FindFlows(dir: string) {
};
return allFiles(dir, '.flow-meta.xml');
}

27 changes: 27 additions & 0 deletions src/libs/FindIgnoreFile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import {readdirSync, statSync} from 'fs';
import * as path from 'path';

export function FindIgnoreFile(dir: string) {
const allFiles = (dir, ext, files?, result?, regex?) => {
files = files || readdirSync(dir);
result = result || [];
regex = regex || new RegExp(`\\${ext}$`);

for (let i = 0; i < files.length; i++) {
let file = path.join(dir, files[i]);
if (statSync(file).isDirectory() && !path.extname(file)) {
try {
result = allFiles(file, ext, readdirSync(file), result, regex);
} catch (error) {
continue;
}
} else {
if (regex.test(file)) {
result.push(file);
}
}
}
return result;
};
return allFiles(dir, '.flowscanignore.json');
}
2 changes: 1 addition & 1 deletion src/libs/ParseFlows.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import path = require('path');
import * as path from 'path';
import {Flow} from 'lightningflowscan-core/out/main/models/Flow';
import {XMLParser} from './XMLParser';
import { fs } from '@salesforce/core/lib/util/fs';
Expand Down
12 changes: 12 additions & 0 deletions src/models/IgnoredFlowViolations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export class IgnoredFlowViolations {

public flowlabels: string[];

constructor(flowlabels: string[] | string) {
if (Array.isArray(flowlabels)) {
this.flowlabels = flowlabels;
} else {
this.flowlabels = [flowlabels];
}
}
}
12 changes: 12 additions & 0 deletions src/models/IgnoredRuleViolationsInFlows.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export class IgnoredRuleViolationsInFlows {

public ignoredRuleViolationsInFlows;

constructor(ignoredRuleViolationsInFlows: any) {
if (Array.isArray(ignoredRuleViolationsInFlows)) {
this.ignoredRuleViolationsInFlows = ignoredRuleViolationsInFlows;
} else {
this.ignoredRuleViolationsInFlows = [ignoredRuleViolationsInFlows];
}
}
}
6 changes: 3 additions & 3 deletions src/models/Violation.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
export class Violation {
public label: string;
public flowlabel: string;
public ruleLabel: string;
public ruleDescription: string;
public numberOfViolations: number;

constructor(label: string, ruleLabel: string, ruleDescription: string, numberOfViolatinos: number){
this.label = label;
constructor(flowlabel: string, ruleLabel: string, ruleDescription: string, numberOfViolatinos: number){
this.flowlabel = flowlabel;
this.ruleLabel = ruleLabel;
this.ruleDescription = ruleDescription;
this.numberOfViolations = numberOfViolatinos;
Expand Down