diff --git a/assets/example-flows/.flow-scanner.yml b/assets/example-flows/.flow-scanner.yml index df1b8df..f0a998a 100644 --- a/assets/example-flows/.flow-scanner.yml +++ b/assets/example-flows/.flow-scanner.yml @@ -48,4 +48,6 @@ rules: severity: error UnusedVariable: severity: error + MissingMetadataDescription: + severity: warning exceptions: \ No newline at end of file diff --git a/assets/example-flows/force-app/main/default/flows/Missing_Metadata_Description.flow-meta.xml b/assets/example-flows/force-app/main/default/flows/Missing_Metadata_Description.flow-meta.xml new file mode 100644 index 0000000..b201097 --- /dev/null +++ b/assets/example-flows/force-app/main/default/flows/Missing_Metadata_Description.flow-meta.xml @@ -0,0 +1,78 @@ + + + + create_account_manually + + 440 + 242 + FeedItem.NewTaskFromFeedItem + quickAction + CurrentTransaction + + contextId + + $User.Id + + + FeedItem.NewTaskFromFeedItem + 1 + + 58.0 + This flow demonstrates a violation of the rule "Missing Metadata Description". + Default + Missing Metadata Description {!$Flow.CurrentDateTime} + + + BuilderType + + LightningFlowBuilder + + + + CanvasMode + + AUTO_LAYOUT_CANVAS + + + + OriginBuilderType + + LightningFlowBuilder + + + AutoLaunchedFlow + + create_Test_Account + + 176 + 134 + + create_account_manually + + + Name + + Test Account + + + Account + true + + + 50 + 0 + + create_Test_Account + + + Active + + Account + SObject + false + false + false + Account + + 10 + \ No newline at end of file diff --git a/assets/example-flows/force-app/main/default/flows/demo/Hardcoded_Id.flow-meta.xml b/assets/example-flows/force-app/main/default/flows/demo/Hardcoded_Id.flow-meta.xml index 33e20a7..499ce42 100644 --- a/assets/example-flows/force-app/main/default/flows/demo/Hardcoded_Id.flow-meta.xml +++ b/assets/example-flows/force-app/main/default/flows/demo/Hardcoded_Id.flow-meta.xml @@ -3,6 +3,7 @@ create_account_manually + create account description 440 242 FeedItem.NewTaskFromFeedItem @@ -44,6 +45,7 @@ create_Test_Account + create Test Account description 176 134 @@ -74,6 +76,7 @@ Active Account + Account description SObject false false diff --git a/assets/example-flows/force-app/main/default/flows/demo/Missing_Error_Handler.flow-meta.xml b/assets/example-flows/force-app/main/default/flows/demo/Missing_Error_Handler.flow-meta.xml index d3e94bb..15dfe47 100644 --- a/assets/example-flows/force-app/main/default/flows/demo/Missing_Error_Handler.flow-meta.xml +++ b/assets/example-flows/force-app/main/default/flows/demo/Missing_Error_Handler.flow-meta.xml @@ -3,6 +3,7 @@ log_call + description 176 134 LogACall diff --git a/assets/example-flows/force-app/main/default/flows/testing/Missing_Error_Handler_Fixed.flow-meta.xml b/assets/example-flows/force-app/main/default/flows/testing/Missing_Error_Handler_Fixed.flow-meta.xml index dd0386b..23be6d3 100644 --- a/assets/example-flows/force-app/main/default/flows/testing/Missing_Error_Handler_Fixed.flow-meta.xml +++ b/assets/example-flows/force-app/main/default/flows/testing/Missing_Error_Handler_Fixed.flow-meta.xml @@ -3,6 +3,7 @@ dosomethingelse + description 440 242 NewTask @@ -20,6 +21,7 @@ log_call + description 176 134 LogACall diff --git a/src/main/rules/MissingMetadataDescription.ts b/src/main/rules/MissingMetadataDescription.ts new file mode 100644 index 0000000..3aa4866 --- /dev/null +++ b/src/main/rules/MissingMetadataDescription.ts @@ -0,0 +1,41 @@ +import { IRuleDefinition } from "../interfaces/IRuleDefinition"; +import * as core from "../internals/internals"; +import { RuleCommon } from "../models/RuleCommon"; + +export class MissingMetadataDescription extends RuleCommon implements IRuleDefinition { + constructor() { + super({ + autoFixable: false, + description: "Every element must have a meaningful description", + docRefs: [], + isConfigurable: false, + label: "Missing Metadata Description", + name: "MissingMetadataDescription", + supportedTypes: core.FlowType.allTypes(), + }); + } + + protected check( + flow: core.Flow, + _options: object | undefined, + _suppression: Set + ): core.Violation[] { + const violations: core.Violation[] = []; + + flow.elements + .filter((elem) => { + if ( + elem.metaType !== "metadata" && + !elem.element["description"] && + elem.subtype !== "start" + ) { + return elem; + } + }) + .forEach((elem) => { + return violations.push(new core.Violation(elem)); + }); + + return violations; + } +} diff --git a/src/main/store/DefaultRuleStore.ts b/src/main/store/DefaultRuleStore.ts index f837d63..b4ff514 100644 --- a/src/main/store/DefaultRuleStore.ts +++ b/src/main/store/DefaultRuleStore.ts @@ -21,6 +21,7 @@ import { TriggerOrder } from "../rules/TriggerOrder"; import { UnconnectedElement } from "../rules/UnconnectedElement"; import { UnsafeRunningContext } from "../rules/UnsafeRunningContext"; import { UnusedVariable } from "../rules/UnusedVariable"; +import { MissingMetadataDescription } from "../rules/MissingMetadataDescription"; export const DefaultRuleStore: object = { ActionCallsInLoop, @@ -46,6 +47,7 @@ export const DefaultRuleStore: object = { UnconnectedElement, UnsafeRunningContext, UnusedVariable, + MissingMetadataDescription, }; export const BetaRuleStore: object = { diff --git a/tests/MissingMetadataDescription.test.ts b/tests/MissingMetadataDescription.test.ts new file mode 100644 index 0000000..1a5b229 --- /dev/null +++ b/tests/MissingMetadataDescription.test.ts @@ -0,0 +1,16 @@ +import * as core from "../src"; +import * as path from "path"; + +import { describe, it, expect } from "@jest/globals"; + +describe("HardcodedId", () => { + const example_uri = path.join(__dirname, "../assets/example-flows/force-app/main/default/flows/Missing_Metadata_Description.flow-meta.xml"); + + it("there should be 1 results for the rule MissingMetadataDescription", async () => { + const flows = await core.parse([example_uri]); + const results: core.ScanResult[] = core.scan(flows); + const occurringResults = results[0].ruleResults.filter((rule) => rule.occurs); + expect(occurringResults).toHaveLength(1); + expect(occurringResults.filter(ruleName => ruleName.ruleName === "MissingMetadataDescription")[0].ruleName).toBe("MissingMetadataDescription"); + }); +});