Skip to content

Commit 215e41e

Browse files
committed
feat: check if file name is an apex class or apex trigger using the dx directory flag
1 parent 664c755 commit 215e41e

File tree

6 files changed

+200
-7
lines changed

6 files changed

+200
-7
lines changed

README.md

Lines changed: 178 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ This will create a coverage JSON in this relative path - `coverage/coverage/cove
1414

1515
This JSON isn't accepted by SonarQube automatically and needs to be converted using this plugin.
1616

17+
Note: Until this [issue](https://github.com/forcedotcom/cli/issues/1813) is resolved in the Salesforce CLI, this will not work properly if there is an Apex class and trigger with the same name. Once this issue is resolved on the CLI, this plugin will be updated to account for the file extension additions.
18+
1719
## Install
1820

1921
```bash
@@ -35,7 +37,7 @@ USAGE
3537
FLAGS
3638
-j, --coverage-json=<value> The path to the JSON file created by the Salesforce CLI for code coverage.
3739
-x, --xml=<value> [default: coverage.xml] Output path for the XML file created by this plugin
38-
-d, --dx-directory=<value> [default: force-app/main/default] The root directory containing your Salesforce metadata.
40+
-d, --dx-directory=<value> [default: force-app/main/default] The root directory containing your Salesforce metadata (should be the relative path in your repository).
3941
4042
GLOBAL FLAGS
4143
--json Format output as json.
@@ -46,3 +48,178 @@ DESCRIPTION
4648
EXAMPLES
4749
$ apex-code-coverage transformer transform -j "test.json" -x "coverage.xml" -d "force-app/main/default"
4850
```
51+
52+
## Example
53+
54+
A JSON created by the Salesforce CLI :
55+
56+
```json
57+
{
58+
"no-map/AccountTrigger": {
59+
"fnMap": {},
60+
"branchMap": {},
61+
"path": "no-map/AccountTrigger",
62+
"f": {},
63+
"b": {},
64+
"s": {
65+
"52": 0,
66+
"53": 0,
67+
"54": 1,
68+
"55": 1,
69+
"56": 1,
70+
"57": 1,
71+
"58": 1,
72+
"59": 0,
73+
"60": 0,
74+
"61": 1,
75+
"62": 1,
76+
"63": 1,
77+
"64": 1,
78+
"65": 1,
79+
"66": 1,
80+
"67": 1,
81+
"68": 1,
82+
"69": 1,
83+
"70": 1,
84+
"71": 1,
85+
"72": 1,
86+
"73": 1,
87+
"74": 1,
88+
"75": 1,
89+
"76": 1,
90+
"77": 1,
91+
"78": 1,
92+
"79": 1,
93+
"80": 1,
94+
"81": 1,
95+
"82": 1
96+
},
97+
"statementMap": {
98+
"52": { "start": { "line": 52, "column": 0 }, "end": { "line": 52, "column": 0 } },
99+
"53": { "start": { "line": 53, "column": 0 }, "end": { "line": 53, "column": 0 } },
100+
"54": { "start": { "line": 54, "column": 0 }, "end": { "line": 54, "column": 0 } },
101+
"55": { "start": { "line": 55, "column": 0 }, "end": { "line": 55, "column": 0 } },
102+
"56": { "start": { "line": 56, "column": 0 }, "end": { "line": 56, "column": 0 } },
103+
"57": { "start": { "line": 57, "column": 0 }, "end": { "line": 57, "column": 0 } },
104+
"58": { "start": { "line": 58, "column": 0 }, "end": { "line": 58, "column": 0 } },
105+
"59": { "start": { "line": 59, "column": 0 }, "end": { "line": 59, "column": 0 } },
106+
"60": { "start": { "line": 60, "column": 0 }, "end": { "line": 60, "column": 0 } },
107+
"61": { "start": { "line": 61, "column": 0 }, "end": { "line": 61, "column": 0 } },
108+
"62": { "start": { "line": 62, "column": 0 }, "end": { "line": 62, "column": 0 } },
109+
"63": { "start": { "line": 63, "column": 0 }, "end": { "line": 63, "column": 0 } },
110+
"64": { "start": { "line": 64, "column": 0 }, "end": { "line": 64, "column": 0 } },
111+
"65": { "start": { "line": 65, "column": 0 }, "end": { "line": 65, "column": 0 } },
112+
"66": { "start": { "line": 66, "column": 0 }, "end": { "line": 66, "column": 0 } },
113+
"67": { "start": { "line": 67, "column": 0 }, "end": { "line": 67, "column": 0 } },
114+
"68": { "start": { "line": 68, "column": 0 }, "end": { "line": 68, "column": 0 } },
115+
"69": { "start": { "line": 69, "column": 0 }, "end": { "line": 69, "column": 0 } },
116+
"70": { "start": { "line": 70, "column": 0 }, "end": { "line": 70, "column": 0 } },
117+
"71": { "start": { "line": 71, "column": 0 }, "end": { "line": 71, "column": 0 } },
118+
"72": { "start": { "line": 72, "column": 0 }, "end": { "line": 72, "column": 0 } },
119+
"73": { "start": { "line": 73, "column": 0 }, "end": { "line": 73, "column": 0 } },
120+
"74": { "start": { "line": 74, "column": 0 }, "end": { "line": 74, "column": 0 } },
121+
"75": { "start": { "line": 75, "column": 0 }, "end": { "line": 75, "column": 0 } },
122+
"76": { "start": { "line": 76, "column": 0 }, "end": { "line": 76, "column": 0 } },
123+
"77": { "start": { "line": 77, "column": 0 }, "end": { "line": 77, "column": 0 } },
124+
"78": { "start": { "line": 78, "column": 0 }, "end": { "line": 78, "column": 0 } },
125+
"79": { "start": { "line": 79, "column": 0 }, "end": { "line": 79, "column": 0 } },
126+
"80": { "start": { "line": 80, "column": 0 }, "end": { "line": 80, "column": 0 } },
127+
"81": { "start": { "line": 81, "column": 0 }, "end": { "line": 81, "column": 0 } },
128+
"82": { "start": { "line": 82, "column": 0 }, "end": { "line": 82, "column": 0 } }
129+
}
130+
},
131+
"no-map/AccountProfile": {
132+
"fnMap": {},
133+
"branchMap": {},
134+
"path": "no-map/AccountProfile",
135+
"f": {},
136+
"b": {},
137+
"s": {
138+
"52": 0,
139+
"53": 0,
140+
"54": 1,
141+
"55": 1,
142+
"56": 1,
143+
"57": 1,
144+
"58": 1,
145+
"59": 0,
146+
"60": 0,
147+
"61": 1,
148+
"62": 1,
149+
"63": 1,
150+
"64": 1,
151+
"65": 1,
152+
"66": 1,
153+
"67": 1,
154+
"68": 1,
155+
"69": 1,
156+
"70": 1,
157+
"71": 1,
158+
"72": 1,
159+
"73": 1,
160+
"74": 1,
161+
"75": 1,
162+
"76": 1,
163+
"77": 1,
164+
"78": 1,
165+
"79": 1,
166+
"80": 1,
167+
"81": 1,
168+
"82": 1
169+
},
170+
"statementMap": {
171+
"52": { "start": { "line": 52, "column": 0 }, "end": { "line": 52, "column": 0 } },
172+
"53": { "start": { "line": 53, "column": 0 }, "end": { "line": 53, "column": 0 } },
173+
"54": { "start": { "line": 54, "column": 0 }, "end": { "line": 54, "column": 0 } },
174+
"55": { "start": { "line": 55, "column": 0 }, "end": { "line": 55, "column": 0 } },
175+
"56": { "start": { "line": 56, "column": 0 }, "end": { "line": 56, "column": 0 } },
176+
"57": { "start": { "line": 57, "column": 0 }, "end": { "line": 57, "column": 0 } },
177+
"58": { "start": { "line": 58, "column": 0 }, "end": { "line": 58, "column": 0 } },
178+
"59": { "start": { "line": 59, "column": 0 }, "end": { "line": 59, "column": 0 } },
179+
"60": { "start": { "line": 60, "column": 0 }, "end": { "line": 60, "column": 0 } },
180+
"61": { "start": { "line": 61, "column": 0 }, "end": { "line": 61, "column": 0 } },
181+
"62": { "start": { "line": 62, "column": 0 }, "end": { "line": 62, "column": 0 } },
182+
"63": { "start": { "line": 63, "column": 0 }, "end": { "line": 63, "column": 0 } },
183+
"64": { "start": { "line": 64, "column": 0 }, "end": { "line": 64, "column": 0 } },
184+
"65": { "start": { "line": 65, "column": 0 }, "end": { "line": 65, "column": 0 } },
185+
"66": { "start": { "line": 66, "column": 0 }, "end": { "line": 66, "column": 0 } },
186+
"67": { "start": { "line": 67, "column": 0 }, "end": { "line": 67, "column": 0 } },
187+
"68": { "start": { "line": 68, "column": 0 }, "end": { "line": 68, "column": 0 } },
188+
"69": { "start": { "line": 69, "column": 0 }, "end": { "line": 69, "column": 0 } },
189+
"70": { "start": { "line": 70, "column": 0 }, "end": { "line": 70, "column": 0 } },
190+
"71": { "start": { "line": 71, "column": 0 }, "end": { "line": 71, "column": 0 } },
191+
"72": { "start": { "line": 72, "column": 0 }, "end": { "line": 72, "column": 0 } },
192+
"73": { "start": { "line": 73, "column": 0 }, "end": { "line": 73, "column": 0 } },
193+
"74": { "start": { "line": 74, "column": 0 }, "end": { "line": 74, "column": 0 } },
194+
"75": { "start": { "line": 75, "column": 0 }, "end": { "line": 75, "column": 0 } },
195+
"76": { "start": { "line": 76, "column": 0 }, "end": { "line": 76, "column": 0 } },
196+
"77": { "start": { "line": 77, "column": 0 }, "end": { "line": 77, "column": 0 } },
197+
"78": { "start": { "line": 78, "column": 0 }, "end": { "line": 78, "column": 0 } },
198+
"79": { "start": { "line": 79, "column": 0 }, "end": { "line": 79, "column": 0 } },
199+
"80": { "start": { "line": 80, "column": 0 }, "end": { "line": 80, "column": 0 } },
200+
"81": { "start": { "line": 81, "column": 0 }, "end": { "line": 81, "column": 0 } },
201+
"82": { "start": { "line": 82, "column": 0 }, "end": { "line": 82, "column": 0 } }
202+
}
203+
}
204+
}
205+
```
206+
207+
will be converted to:
208+
209+
```xml
210+
<?xml version="1.0"?>
211+
<coverage version="1">
212+
<file path="force-app/main/default/triggers/AccountTrigger.trigger">
213+
<lineToCover lineNumber="52" covered="false"/>
214+
<lineToCover lineNumber="53" covered="false"/>
215+
<lineToCover lineNumber="59" covered="false"/>
216+
<lineToCover lineNumber="60" covered="false"/>
217+
</file>
218+
<file path="force-app/main/default/classes/AccountProfile.cls">
219+
<lineToCover lineNumber="52" covered="false"/>
220+
<lineToCover lineNumber="53" covered="false"/>
221+
<lineToCover lineNumber="59" covered="false"/>
222+
<lineToCover lineNumber="60" covered="false"/>
223+
</file>
224+
</coverage>
225+
```
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// Test Apex Class
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// Test Apex Trigger

messages/transformer.transform.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ This plugin will convert the JSON file created by the Salesforce CLI during Apex
1212

1313
# flags.dx-directory.summary
1414

15-
Directory containing Salesforce metadata (default: `force-app/main/default`).
15+
Directory containing Salesforce metadata relative to your repository (default: `force-app/main/default`).
1616

1717
# flags.coverage-json.summary
1818

src/commands/apex-code-coverage/transformer/transform.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ export default class TransformerTransform extends SfCommand<TransformerTransform
1919
public static readonly examples = messages.getMessages('examples');
2020

2121
public static readonly flags = {
22-
'dx-directory': Flags.directory({
22+
'dx-directory': Flags.string({
2323
summary: messages.getMessage('flags.dx-directory.summary'),
2424
char: 'd',
2525
required: true,
26-
exists: true,
2726
default: 'force-app/main/default',
2827
}),
2928
'coverage-json': Flags.file({
@@ -70,15 +69,30 @@ export default class TransformerTransform extends SfCommand<TransformerTransform
7069
}
7170
}
7271

72+
function findFilePath(className: string, dxDirectory: string): string | null {
73+
const relativeClassPath = `${dxDirectory}/classes/${className}.cls`;
74+
const relativeTriggerPath = `${dxDirectory}/triggers/${className}.trigger`;
75+
76+
const absoluteClassPath = path.resolve(relativeClassPath);
77+
const absoluteTriggerPath = path.resolve(relativeTriggerPath);
78+
if (fs.existsSync(absoluteClassPath)) {
79+
return relativeClassPath;
80+
} else if (fs.existsSync(absoluteTriggerPath)) {
81+
return relativeTriggerPath;
82+
} else {
83+
throw Error(`The file name ${className} was not found in the classes or triggers directory.`);
84+
}
85+
}
86+
7387
function convertToGenericTestReport(data: CoverageData, dxDirectory: string): string {
7488
let xml = '<?xml version="1.0"?>\n<coverage version="1">\n';
7589

7690
for (const className in data) {
7791
if (Object.prototype.hasOwnProperty.call(data, className)) {
7892
const classInfo = data[className];
7993
const formattedClassName = className.replace('no-map/', '');
80-
const classPath = `${dxDirectory}/classes/${formattedClassName}.cls`;
81-
xml += `\t<file path="${classPath}">\n`;
94+
const filePath = findFilePath(formattedClassName, dxDirectory);
95+
xml += `\t<file path="${filePath}">\n`;
8296

8397
for (const lineNumber in classInfo.s) {
8498
if (Object.prototype.hasOwnProperty.call(classInfo.s, lineNumber)) {

test.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"no-map/AccountProfile": {"fnMap":{},"branchMap":{},"path":"no-map/AccountProfile","f":{},"b":{},"s":{"52":0,"53":0,"54":1,"55":1,"56":1,"57":1,"58":1,"59":0,"60":0,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1},"statementMap":{"52":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"53":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"54":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"55":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"56":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"57":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"58":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"59":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"60":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"61":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"62":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"63":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"64":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"65":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"66":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"67":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"68":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"69":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"70":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"71":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"72":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"73":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"74":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"75":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"76":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"77":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"78":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"79":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"80":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"81":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"82":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}}}}}
1+
{"no-map/AccountTrigger": {"fnMap":{},"branchMap":{},"path":"no-map/AccountTrigger","f":{},"b":{},"s":{"52":0,"53":0,"54":1,"55":1,"56":1,"57":1,"58":1,"59":0,"60":0,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1},"statementMap":{"52":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"53":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"54":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"55":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"56":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"57":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"58":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"59":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"60":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"61":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"62":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"63":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"64":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"65":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"66":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"67":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"68":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"69":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"70":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"71":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"72":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"73":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"74":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"75":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"76":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"77":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"78":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"79":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"80":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"81":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"82":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}}}}, "no-map/AccountProfile": {"fnMap":{},"branchMap":{},"path":"no-map/AccountProfile","f":{},"b":{},"s":{"52":0,"53":0,"54":1,"55":1,"56":1,"57":1,"58":1,"59":0,"60":0,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1},"statementMap":{"52":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"53":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"54":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"55":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"56":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"57":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"58":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"59":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"60":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"61":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"62":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"63":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"64":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"65":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"66":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"67":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"68":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"69":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"70":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"71":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"72":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"73":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"74":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"75":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"76":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"77":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"78":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"79":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"80":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"81":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"82":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}}}}}

0 commit comments

Comments
 (0)