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
+
+
+
+ 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");
+ });
+});