sfdx-hardis 7.0.1 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -2
- package/defaults/ci/.github/workflows/check-deploy.yml +1 -1
- package/lib/commands/hardis/org/diagnose/apex-api-version.d.ts +17 -0
- package/lib/commands/hardis/org/diagnose/apex-api-version.js +176 -0
- package/lib/commands/hardis/org/diagnose/apex-api-version.js.map +1 -0
- package/lib/commands/hardis/org/diagnose/minimalpermsets.d.ts +24 -0
- package/lib/commands/hardis/org/diagnose/minimalpermsets.js +252 -0
- package/lib/commands/hardis/org/diagnose/minimalpermsets.js.map +1 -0
- package/lib/commands/hardis/org/monitor/all.js +12 -0
- package/lib/commands/hardis/org/monitor/all.js.map +1 -1
- package/lib/common/notifProvider/types.d.ts +1 -1
- package/lib/common/utils/flowVisualiser/flowParser.d.ts +7 -1
- package/lib/common/utils/flowVisualiser/flowParser.js +57 -34
- package/lib/common/utils/flowVisualiser/flowParser.js.map +1 -1
- package/lib/common/utils/flowVisualiser/renderConfig.d.ts +63 -0
- package/lib/common/utils/flowVisualiser/renderConfig.js +214 -0
- package/lib/common/utils/flowVisualiser/renderConfig.js.map +1 -1
- package/lib/common/utils/i18n.js +3 -2
- package/lib/common/utils/i18n.js.map +1 -1
- package/lib/common/utils/mermaidUtils.d.ts +14 -11
- package/lib/common/utils/mermaidUtils.js +49 -23
- package/lib/common/utils/mermaidUtils.js.map +1 -1
- package/lib/i18n/pt-BR.json +2297 -0
- package/oclif.manifest.json +1665 -1388
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://sfdx-hardis.cloudity.com)
|
|
4
4
|
|
|
5
|
-
_Presented at_ [_Dreamforce 23_](https://reg.salesforce.com/flow/plus/df23/sessioncatalog/page/catalog/session/1684196389783001OqEl) _and [_Dreamforce 24!_](https://reg.salesforce.com/flow/plus/df24/sessioncatalog/page/catalog/session/1718915808069001Q7HH)_
|
|
5
|
+
_Presented at_ [_Dreamforce 23_](https://reg.salesforce.com/flow/plus/df23/sessioncatalog/page/catalog/session/1684196389783001OqEl) _and [_Dreamforce 24!_](https://reg.salesforce.com/flow/plus/df24/sessioncatalog/page/catalog/session/1718915808069001Q7HH)_ - [**See sfdx-hardis v7 Walkthrough video**](https://www.youtube.com/watch?v=t8jT6IPd9n4)
|
|
6
6
|
|
|
7
7
|
[](https://npmjs.org/package/sfdx-hardis)
|
|
8
8
|
[](https://npmjs.org/package/sfdx-hardis)
|
|
@@ -49,6 +49,10 @@ ___
|
|
|
49
49
|
|
|
50
50
|
___
|
|
51
51
|
|
|
52
|
+
_See sfdx-hardis v7 Walkthrough_
|
|
53
|
+
|
|
54
|
+
[](https://www.youtube.com/watch?v=t8jT6IPd9n4)
|
|
55
|
+
|
|
52
56
|
_Featured on SalesforceBen_
|
|
53
57
|
|
|
54
58
|
[](https://www.youtube.com/watch?v=vtWx_IWoL9k)
|
|
@@ -446,7 +450,7 @@ sfdx-hardis is primarily led by Nicolas Vuillamy & [Cloudity](https://www.cloudi
|
|
|
446
450
|
- [Roman Hentschke](https://www.linkedin.com/in/derroman/), for building the BitBucket CI/CD integration and german translation
|
|
447
451
|
- [Leo Jokinen](https://www.linkedin.com/in/leojokinen/), for building the GitHub CI/CD integration
|
|
448
452
|
- [Mariia Pyvovarchuk](https://www.linkedin.com/in/mpyvo/), for her work about generating automations documentation
|
|
449
|
-
- [Matheus Delazeri](https://www.linkedin.com/in/matheus-delazeri-souza/), for the PDF output of documentation
|
|
453
|
+
- [Matheus Delazeri](https://www.linkedin.com/in/matheus-delazeri-souza/), for the PDF output of documentation and brazilian-portuguese translation
|
|
450
454
|
- [Taha Basri](https://www.linkedin.com/in/tahabasri/), for his work about generating documentation of LWC
|
|
451
455
|
- [Anush Poudel](https://www.linkedin.com/in/anushpoudel/), for integrating sfdx-hardis with multiple LLMs using langchainJs
|
|
452
456
|
- [Sebastien Colladon](https://www.linkedin.com/in/sebastien-colladon/), for providing sfdx-git-delta which is highly used within sfdx-hardis
|
|
@@ -470,6 +474,7 @@ sfdx-hardis is primarily led by Nicolas Vuillamy & [Cloudity](https://www.cloudi
|
|
|
470
474
|
- German: [Roman Hentschke](https://www.linkedin.com/in/derroman/)
|
|
471
475
|
- Polish: [Dagmara Ryborz](https://www.linkedin.com/in/dagmara-ryborz-7618b991/)
|
|
472
476
|
- Japanese: [Shinnosuke Takakura](https://www.linkedin.com/in/shinnosuke-takakura-9041ba217/)
|
|
477
|
+
- Brazilian-portuguese: [Matheus Delazeri](https://www.linkedin.com/in/matheus-delazeri-souza/)
|
|
473
478
|
|
|
474
479
|
<!-- contributors.md end -->
|
|
475
480
|
|
|
@@ -59,7 +59,7 @@ jobs:
|
|
|
59
59
|
SFDX_CLIENT_KEY_PREPROD: ${{ secrets.SFDX_CLIENT_KEY_PREPROD}}
|
|
60
60
|
SFDX_CLIENT_ID_MAIN: ${{ secrets.SFDX_CLIENT_ID_MAIN}}
|
|
61
61
|
SFDX_CLIENT_KEY_MAIN: ${{ secrets.SFDX_CLIENT_KEY_MAIN}}
|
|
62
|
-
SFDX_AUTH_URL_TECHNICAL_ORG: ${{ SFDX_AUTH_URL_TECHNICAL_ORG }}
|
|
62
|
+
SFDX_AUTH_URL_TECHNICAL_ORG: ${{ secrets.SFDX_AUTH_URL_TECHNICAL_ORG }}
|
|
63
63
|
SFDX_DEPLOY_WAIT_MINUTES: ${{ vars.SFDX_DEPLOY_WAIT_MINUTES || '120' }}
|
|
64
64
|
SFDX_TEST_WAIT_MINUTES: ${{ vars.SFDX_TEST_WAIT_MINUTES || '120' }}
|
|
65
65
|
CI_COMMIT_REF_NAME: ${{ github.event.pull_request.base.ref }} # Defines the target branch of the PR
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
import { AnyJson } from '@salesforce/ts-types';
|
|
3
|
+
export default class DiagnoseApexApiVersion extends SfCommand<any> {
|
|
4
|
+
static title: string;
|
|
5
|
+
static description: string;
|
|
6
|
+
static examples: string[];
|
|
7
|
+
static flags: any;
|
|
8
|
+
static requiresProject: boolean;
|
|
9
|
+
protected static triggerNotification: boolean;
|
|
10
|
+
protected debugMode: boolean;
|
|
11
|
+
protected outputFile: any;
|
|
12
|
+
protected outputFilesRes: any;
|
|
13
|
+
protected deprecatedClasses: any[];
|
|
14
|
+
protected deprecatedTriggers: any[];
|
|
15
|
+
protected statusCode: number;
|
|
16
|
+
run(): Promise<AnyJson>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/* jscpd:ignore-start */
|
|
2
|
+
import { SfCommand, Flags, requiredOrgFlagWithDeprecations } from '@salesforce/sf-plugins-core';
|
|
3
|
+
import { Messages } from '@salesforce/core';
|
|
4
|
+
import c from 'chalk';
|
|
5
|
+
import { uxLog, uxLogTable } from '../../../../common/utils/index.js';
|
|
6
|
+
import { soqlQueryTooling } from '../../../../common/utils/apiUtils.js';
|
|
7
|
+
import { generateCsvFile, generateReportPath } from '../../../../common/utils/filesUtils.js';
|
|
8
|
+
import { getNotificationButtons, getOrgMarkdown, getSeverityIcon } from '../../../../common/utils/notifUtils.js';
|
|
9
|
+
import { NotifProvider } from '../../../../common/notifProvider/index.js';
|
|
10
|
+
import { setConnectionVariables } from '../../../../common/utils/orgUtils.js';
|
|
11
|
+
import { CONSTANTS, getEnvVar } from '../../../../config/index.js';
|
|
12
|
+
import { isTestClass } from '../../../../common/utils/apexLimitUtils.js';
|
|
13
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
14
|
+
const messages = Messages.loadMessages('sfdx-hardis', 'org');
|
|
15
|
+
const DEFAULT_DEPRECATED_APEX_API_VERSION = 50;
|
|
16
|
+
export default class DiagnoseApexApiVersion extends SfCommand {
|
|
17
|
+
static title = 'Check Apex classes and triggers for deprecated API versions';
|
|
18
|
+
static description = `Detects Apex classes and triggers deployed with API versions at or below a configurable threshold.
|
|
19
|
+
|
|
20
|
+
**Apex metadata API version** is the version the code was compiled against. This is separate from \`hardis:org:diagnose:legacyapi\`, which checks deprecated **API call** versions (SOAP, REST, Bulk) from EventLogFile.
|
|
21
|
+
|
|
22
|
+
Key functionalities:
|
|
23
|
+
|
|
24
|
+
- **Threshold-based detection:** API versions at or below the threshold are flagged as deprecated. Configure via \`DEPRECATED_APEX_API_VERSION\` env var (default: \`50\`).
|
|
25
|
+
- **Apex classes:** Queries custom Apex classes (excludes managed packages). Optionally excludes \`@isTest\` classes via \`--includetestclasses\`.
|
|
26
|
+
- **Apex triggers:** Queries custom Apex triggers (excludes managed packages).
|
|
27
|
+
- **CSV report:** Generates a report listing all deprecated classes and triggers with their ApiVersion.
|
|
28
|
+
- **Notifications:** Sends alerts to Grafana, Slack, MS Teams when deprecated Apex is found.
|
|
29
|
+
|
|
30
|
+
This command is part of [sfdx-hardis Monitoring](${CONSTANTS.DOC_URL_ROOT}/salesforce-monitoring-home/) and can output Grafana, Slack and MsTeams Notifications.
|
|
31
|
+
`;
|
|
32
|
+
static examples = [
|
|
33
|
+
'$ sf hardis:org:diagnose:apex-api-version',
|
|
34
|
+
'$ sf hardis:org:diagnose:apex-api-version --threshold 55',
|
|
35
|
+
'$ sf hardis:org:diagnose:apex-api-version --outputfile ./reports/apex-api-version.csv',
|
|
36
|
+
];
|
|
37
|
+
static flags = {
|
|
38
|
+
threshold: Flags.integer({
|
|
39
|
+
char: 't',
|
|
40
|
+
description: `API version threshold. Classes/triggers with ApiVersion <= this value are flagged. Overrides DEPRECATED_APEX_API_VERSION env var.`,
|
|
41
|
+
}),
|
|
42
|
+
includetestclasses: Flags.boolean({
|
|
43
|
+
char: 'i',
|
|
44
|
+
default: false,
|
|
45
|
+
description: 'Include @isTest classes in the report (excluded by default)',
|
|
46
|
+
}),
|
|
47
|
+
outputfile: Flags.string({
|
|
48
|
+
char: 'f',
|
|
49
|
+
description: 'Force the path and name of output report file. Must end with .csv',
|
|
50
|
+
}),
|
|
51
|
+
debug: Flags.boolean({
|
|
52
|
+
char: 'd',
|
|
53
|
+
default: false,
|
|
54
|
+
description: messages.getMessage('debugMode'),
|
|
55
|
+
}),
|
|
56
|
+
websocket: Flags.string({
|
|
57
|
+
description: messages.getMessage('websocket'),
|
|
58
|
+
}),
|
|
59
|
+
skipauth: Flags.boolean({
|
|
60
|
+
description: 'Skip authentication check when a default username is required',
|
|
61
|
+
}),
|
|
62
|
+
'target-org': requiredOrgFlagWithDeprecations,
|
|
63
|
+
};
|
|
64
|
+
static requiresProject = false;
|
|
65
|
+
static triggerNotification = true;
|
|
66
|
+
debugMode = false;
|
|
67
|
+
outputFile;
|
|
68
|
+
outputFilesRes = {};
|
|
69
|
+
deprecatedClasses = [];
|
|
70
|
+
deprecatedTriggers = [];
|
|
71
|
+
statusCode = 0;
|
|
72
|
+
/* jscpd:ignore-end */
|
|
73
|
+
async run() {
|
|
74
|
+
const { flags } = await this.parse(DiagnoseApexApiVersion);
|
|
75
|
+
this.debugMode = flags.debug || false;
|
|
76
|
+
this.outputFile = flags.outputfile || null;
|
|
77
|
+
const threshold = flags.threshold ??
|
|
78
|
+
parseInt(getEnvVar('DEPRECATED_APEX_API_VERSION') || String(DEFAULT_DEPRECATED_APEX_API_VERSION), 10);
|
|
79
|
+
if (!Number.isFinite(threshold) || threshold < 1) {
|
|
80
|
+
throw new Error(`Invalid DEPRECATED_APEX_API_VERSION or --threshold: must be a positive integer`);
|
|
81
|
+
}
|
|
82
|
+
const includeTestClasses = flags.includetestclasses ?? false;
|
|
83
|
+
const conn = flags['target-org'].getConnection();
|
|
84
|
+
uxLog("action", this, c.cyan(`Querying Apex classes and triggers with ApiVersion <= ${threshold} (custom/unmanaged only)...`));
|
|
85
|
+
// Query Apex classes - need Body to detect @isTest when excluding
|
|
86
|
+
const classesQuery = includeTestClasses
|
|
87
|
+
? `SELECT Id, Name, ApiVersion FROM ApexClass WHERE NamespacePrefix = null AND ApiVersion <= ${threshold} ORDER BY ApiVersion ASC, Name ASC`
|
|
88
|
+
: `SELECT Id, Name, ApiVersion, Body FROM ApexClass WHERE NamespacePrefix = null AND ApiVersion <= ${threshold} ORDER BY ApiVersion ASC, Name ASC`;
|
|
89
|
+
const classesRes = await soqlQueryTooling(classesQuery, conn);
|
|
90
|
+
let classes = (classesRes.records || []);
|
|
91
|
+
if (!includeTestClasses && classes.length > 0) {
|
|
92
|
+
classes = classes.filter((cls) => !isTestClass(cls.Body));
|
|
93
|
+
}
|
|
94
|
+
this.deprecatedClasses = classes.map((cls) => ({
|
|
95
|
+
Type: 'ApexClass',
|
|
96
|
+
Name: cls.Name,
|
|
97
|
+
ApiVersion: cls.ApiVersion,
|
|
98
|
+
severity: 'warning',
|
|
99
|
+
severityIcon: getSeverityIcon('warning'),
|
|
100
|
+
}));
|
|
101
|
+
// Query Apex triggers
|
|
102
|
+
const triggersQuery = `SELECT Id, Name, ApiVersion FROM ApexTrigger WHERE NamespacePrefix = null AND ApiVersion <= ${threshold} ORDER BY ApiVersion ASC, Name ASC`;
|
|
103
|
+
const triggersRes = await soqlQueryTooling(triggersQuery, conn);
|
|
104
|
+
const triggers = (triggersRes.records || []);
|
|
105
|
+
this.deprecatedTriggers = triggers.map((trg) => ({
|
|
106
|
+
Type: 'ApexTrigger',
|
|
107
|
+
Name: trg.Name,
|
|
108
|
+
ApiVersion: trg.ApiVersion,
|
|
109
|
+
severity: 'warning',
|
|
110
|
+
severityIcon: getSeverityIcon('warning'),
|
|
111
|
+
}));
|
|
112
|
+
const allDeprecated = [...this.deprecatedClasses, ...this.deprecatedTriggers];
|
|
113
|
+
const totalCount = allDeprecated.length;
|
|
114
|
+
// Display summary
|
|
115
|
+
uxLog("action", this, c.cyan('Results'));
|
|
116
|
+
uxLog("log", this, c.grey(`Found ${this.deprecatedClasses.length} deprecated Apex class(es) and ${this.deprecatedTriggers.length} deprecated Apex trigger(s) with ApiVersion <= ${threshold}`));
|
|
117
|
+
if (totalCount > 0) {
|
|
118
|
+
this.statusCode = 1;
|
|
119
|
+
uxLogTable(this, allDeprecated);
|
|
120
|
+
uxLog("warning", this, c.yellow(`Consider upgrading these to a newer API version. Use \`sf hardis:project:audit:apiversion\` to update metadata files.`));
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
uxLog("success", this, c.green(`No Apex classes or triggers with ApiVersion <= ${threshold} found.`));
|
|
124
|
+
}
|
|
125
|
+
// Generate CSV report
|
|
126
|
+
this.outputFile = await generateReportPath('apex-api-version', this.outputFile);
|
|
127
|
+
this.outputFilesRes = await generateCsvFile(allDeprecated, this.outputFile, {
|
|
128
|
+
fileTitle: 'Apex API Version (Deprecated)',
|
|
129
|
+
});
|
|
130
|
+
// Notifications
|
|
131
|
+
await setConnectionVariables(flags['target-org']?.getConnection());
|
|
132
|
+
const orgMarkdown = await getOrgMarkdown(flags['target-org']?.getConnection()?.instanceUrl);
|
|
133
|
+
const notifButtons = await getNotificationButtons();
|
|
134
|
+
let notifSeverity = 'log';
|
|
135
|
+
let notifText = `No deprecated Apex API versions found in ${orgMarkdown} (threshold: ${threshold})`;
|
|
136
|
+
const notifAttachments = [];
|
|
137
|
+
if (totalCount > 0) {
|
|
138
|
+
notifSeverity = 'warning';
|
|
139
|
+
notifText = `${totalCount} Apex class(es)/trigger(s) with deprecated API version (<= ${threshold}) in ${orgMarkdown}`;
|
|
140
|
+
const detailText = allDeprecated
|
|
141
|
+
.slice(0, 20)
|
|
142
|
+
.map((r) => `• ${r.Type} ${r.Name}: ApiVersion ${r.ApiVersion}`)
|
|
143
|
+
.join('\n');
|
|
144
|
+
notifAttachments.push({
|
|
145
|
+
text: totalCount > 20 ? `${detailText}\n... and ${totalCount - 20} more` : detailText,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
await NotifProvider.postNotifications({
|
|
149
|
+
type: 'APEX_API_VERSION',
|
|
150
|
+
text: notifText,
|
|
151
|
+
attachments: notifAttachments,
|
|
152
|
+
buttons: notifButtons,
|
|
153
|
+
severity: notifSeverity,
|
|
154
|
+
attachedFiles: this.outputFilesRes.xlsxFile ? [this.outputFilesRes.xlsxFile] : [],
|
|
155
|
+
logElements: allDeprecated,
|
|
156
|
+
data: { metric: totalCount, threshold },
|
|
157
|
+
metrics: {
|
|
158
|
+
deprecatedApexClasses: this.deprecatedClasses.length,
|
|
159
|
+
deprecatedApexTriggers: this.deprecatedTriggers.length,
|
|
160
|
+
deprecatedApexTotal: totalCount,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
if ((this.argv || []).includes('apex-api-version')) {
|
|
164
|
+
process.exitCode = this.statusCode;
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
status: this.statusCode,
|
|
168
|
+
threshold,
|
|
169
|
+
deprecatedClasses: this.deprecatedClasses.length,
|
|
170
|
+
deprecatedTriggers: this.deprecatedTriggers.length,
|
|
171
|
+
total: totalCount,
|
|
172
|
+
outputFile: this.outputFile,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=apex-api-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apex-api-version.js","sourceRoot":"","sources":["../../../../../src/commands/hardis/org/diagnose/apex-api-version.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,CAAC,MAAM,OAAO,CAAC;AACtB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACjH,OAAO,EAAE,aAAa,EAAiB,MAAM,2CAA2C,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAEzE,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AAE7D,MAAM,mCAAmC,GAAG,EAAE,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,SAAc;IACzD,MAAM,CAAC,KAAK,GAAG,6DAA6D,CAAC;IAE7E,MAAM,CAAC,WAAW,GAAG;;;;;;;;;;;;mDAYqB,SAAS,CAAC,YAAY;CACxE,CAAC;IAEO,MAAM,CAAC,QAAQ,GAAG;QACvB,2CAA2C;QAC3C,0DAA0D;QAC1D,uFAAuF;KACxF,CAAC;IAEK,MAAM,CAAC,KAAK,GAAQ;QACzB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YACvB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,mIAAmI;SACjJ,CAAC;QACF,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC;YAChC,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,6DAA6D;SAC3E,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,mEAAmE;SACjF,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;SAC9C,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;SAC9C,CAAC;QACF,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;YACtB,WAAW,EAAE,+DAA+D;SAC7E,CAAC;QACF,YAAY,EAAE,+BAA+B;KAC9C,CAAC;IAEK,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC;IAE5B,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAElC,SAAS,GAAG,KAAK,CAAC;IAClB,UAAU,CAAC;IACX,cAAc,GAAQ,EAAE,CAAC;IACzB,iBAAiB,GAAU,EAAE,CAAC;IAC9B,kBAAkB,GAAU,EAAE,CAAC;IAC/B,UAAU,GAAG,CAAC,CAAC;IAEzB,sBAAsB;IAEf,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;QAE3C,MAAM,SAAS,GACb,KAAK,CAAC,SAAS;YACf,QAAQ,CAAC,SAAS,CAAC,6BAA6B,CAAC,IAAI,MAAM,CAAC,mCAAmC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;QACpG,CAAC;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;QAEjD,KAAK,CACH,QAAQ,EACR,IAAI,EACJ,CAAC,CAAC,IAAI,CACJ,yDAAyD,SAAS,6BAA6B,CAChG,CACF,CAAC;QAEF,kEAAkE;QAClE,MAAM,YAAY,GAAG,kBAAkB;YACrC,CAAC,CAAC,6FAA6F,SAAS,oCAAoC;YAC5I,CAAC,CAAC,mGAAmG,SAAS,oCAAoC,CAAC;QAErJ,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAU,CAAC;QAElD,IAAI,CAAC,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,SAAS;YACnB,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC;SACzC,CAAC,CAAC,CAAC;QAEJ,sBAAsB;QACtB,MAAM,aAAa,GAAG,+FAA+F,SAAS,oCAAoC,CAAC;QACnK,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAC,OAAO,IAAI,EAAE,CAAU,CAAC;QAEtD,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,SAAS;YACnB,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC;SACzC,CAAC,CAAC,CAAC;QAEJ,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9E,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;QAExC,kBAAkB;QAClB,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,KAAK,CACH,KAAK,EACL,IAAI,EACJ,CAAC,CAAC,IAAI,CACJ,SAAS,IAAI,CAAC,iBAAiB,CAAC,MAAM,kCAAkC,IAAI,CAAC,kBAAkB,CAAC,MAAM,kDAAkD,SAAS,EAAE,CACpK,CACF,CAAC;QAEF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACpB,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YAChC,KAAK,CACH,SAAS,EACT,IAAI,EACJ,CAAC,CAAC,MAAM,CACN,uHAAuH,CACxH,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,kDAAkD,SAAS,SAAS,CAAC,CAAC,CAAC;QACxG,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,UAAU,GAAG,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChF,IAAI,CAAC,cAAc,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1E,SAAS,EAAE,+BAA+B;SAC3C,CAAC,CAAC;QAEH,gBAAgB;QAChB,MAAM,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;QAC5F,MAAM,YAAY,GAAG,MAAM,sBAAsB,EAAE,CAAC;QACpD,IAAI,aAAa,GAAkB,KAAK,CAAC;QACzC,IAAI,SAAS,GAAG,4CAA4C,WAAW,gBAAgB,SAAS,GAAG,CAAC;QACpG,MAAM,gBAAgB,GAAU,EAAE,CAAC;QAEnC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,aAAa,GAAG,SAAS,CAAC;YAC1B,SAAS,GAAG,GAAG,UAAU,8DAA8D,SAAS,QAAQ,WAAW,EAAE,CAAC;YACtH,MAAM,UAAU,GAAG,aAAa;iBAC7B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;iBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,UAAU,EAAE,CAAC;iBAC/D,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,gBAAgB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,aAAa,UAAU,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU;aACtF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,CAAC,iBAAiB,CAAC;YACpC,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,gBAAgB;YAC7B,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE,aAAa;YACvB,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YACjF,WAAW,EAAE,aAAa;YAC1B,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE;YACvC,OAAO,EAAE;gBACP,qBAAqB,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM;gBACpD,sBAAsB,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM;gBACtD,mBAAmB,EAAE,UAAU;aAChC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;QACrC,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,UAAU;YACvB,SAAS;YACT,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM;YAChD,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM;YAClD,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;IACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
import { AnyJson } from '@salesforce/ts-types';
|
|
3
|
+
export default class DiagnoseMinimalPermsets extends SfCommand<any> {
|
|
4
|
+
static title: string;
|
|
5
|
+
static description: string;
|
|
6
|
+
static examples: string[];
|
|
7
|
+
static flags: any;
|
|
8
|
+
static requiresProject: boolean;
|
|
9
|
+
protected static triggerNotification: boolean;
|
|
10
|
+
protected debugMode: boolean;
|
|
11
|
+
protected outputFile: any;
|
|
12
|
+
protected outputFilesRes: any;
|
|
13
|
+
protected minimalPermSets: any[];
|
|
14
|
+
protected totalCount: number;
|
|
15
|
+
protected errorCount: number;
|
|
16
|
+
protected statusCode: number;
|
|
17
|
+
/**
|
|
18
|
+
* Count permission-granting elements in a parsed PermissionSet XML object.
|
|
19
|
+
* Uses structure to differentiate: leaf elements (primitives/arrays of primitives) are metadata-only;
|
|
20
|
+
* nested elements (objects/arrays of objects) are actual permissions. No hard-coded element names.
|
|
21
|
+
*/
|
|
22
|
+
private countPermissionElements;
|
|
23
|
+
run(): Promise<AnyJson>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/* jscpd:ignore-start */
|
|
2
|
+
import { SfCommand, Flags, requiredOrgFlagWithDeprecations } from '@salesforce/sf-plugins-core';
|
|
3
|
+
import { Messages } from '@salesforce/core';
|
|
4
|
+
import c from 'chalk';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { uxLog, uxLogTable } from '../../../../common/utils/index.js';
|
|
7
|
+
import { generateCsvFile, generateReportPath } from '../../../../common/utils/filesUtils.js';
|
|
8
|
+
import { getNotificationButtons, getOrgMarkdown, getSeverityIcon } from '../../../../common/utils/notifUtils.js';
|
|
9
|
+
import { NotifProvider } from '../../../../common/notifProvider/index.js';
|
|
10
|
+
import { setConnectionVariables } from '../../../../common/utils/orgUtils.js';
|
|
11
|
+
import { CONSTANTS, getEnvVar } from '../../../../config/index.js';
|
|
12
|
+
import { parseXmlFile } from '../../../../common/utils/xmlUtils.js';
|
|
13
|
+
import fs from 'fs-extra';
|
|
14
|
+
import { glob } from 'glob';
|
|
15
|
+
import sortArray from 'sort-array';
|
|
16
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
17
|
+
const messages = Messages.loadMessages('sfdx-hardis', 'org');
|
|
18
|
+
/** xml2js parser keys (attributes, text content) - not permission elements */
|
|
19
|
+
const XML2JS_RESERVED_KEYS = new Set(['$', '_']);
|
|
20
|
+
const DEFAULT_MINIMAL_PERMSETS_THRESHOLD = 5;
|
|
21
|
+
/**
|
|
22
|
+
* Returns true if the value represents a nested/permission element (object or array of objects).
|
|
23
|
+
* Nested elements grant actual permissions (e.g. objectPermissions, fieldPermissions).
|
|
24
|
+
*/
|
|
25
|
+
function isPermissionElementValue(value) {
|
|
26
|
+
if (value == null)
|
|
27
|
+
return false;
|
|
28
|
+
if (Array.isArray(value)) {
|
|
29
|
+
return value.length > 0 && typeof value[0] === 'object' && value[0] !== null;
|
|
30
|
+
}
|
|
31
|
+
return typeof value === 'object';
|
|
32
|
+
}
|
|
33
|
+
const GLOB_IGNORE_PATTERNS = ['**/node_modules/**', '**/.git/**'];
|
|
34
|
+
export default class DiagnoseMinimalPermsets extends SfCommand {
|
|
35
|
+
static title = 'Detect permission sets with minimal permissions';
|
|
36
|
+
static description = `Analyzes permission set metadata files in the sfdx project to identify permission sets with very few permissions (configurable threshold, default: 5 or fewer).
|
|
37
|
+
|
|
38
|
+
These "minimal" permission sets may be candidates for consolidation to reduce org complexity and improve maintainability.
|
|
39
|
+
|
|
40
|
+
Key functionalities:
|
|
41
|
+
|
|
42
|
+
- **Project-based analysis:** Scans \`.permissionset-meta.xml\` files in the project (no org connection required for analysis).
|
|
43
|
+
- **Permission counting:** Uses structure to differentiate leaf elements (primitives) from nested elements (objects). Leaf elements are metadata-only; nested elements grant permissions. Future API additions are supported automatically.
|
|
44
|
+
- **Configurable threshold:** Set \`MINIMAL_PERMSETS_THRESHOLD\` env var or use \`--threshold\` (default: 5).
|
|
45
|
+
- **Metadata directory:** Uses \`--metadata-dir\` or scans \`**/*.permissionset-meta.xml\` in the project.
|
|
46
|
+
- **CSV report:** Generates a report listing minimal permission sets with their permission count.
|
|
47
|
+
- **Notifications:** Sends alerts to Grafana, Slack, MS Teams when minimal permission sets are found.
|
|
48
|
+
|
|
49
|
+
This command is part of [sfdx-hardis Monitoring](${CONSTANTS.DOC_URL_ROOT}/salesforce-monitoring-home/) and can output Grafana, Slack and MsTeams Notifications.
|
|
50
|
+
`;
|
|
51
|
+
static examples = [
|
|
52
|
+
'$ sf hardis:org:diagnose:minimalpermsets',
|
|
53
|
+
'$ sf hardis:org:diagnose:minimalpermsets --threshold 5',
|
|
54
|
+
'$ sf hardis:org:diagnose:minimalpermsets --metadata-dir force-app/main/default/permissionsets',
|
|
55
|
+
];
|
|
56
|
+
static flags = {
|
|
57
|
+
threshold: Flags.integer({
|
|
58
|
+
char: 't',
|
|
59
|
+
description: `Maximum number of permissions to be considered minimal. Overrides MINIMAL_PERMSETS_THRESHOLD env var.`,
|
|
60
|
+
}),
|
|
61
|
+
'metadata-dir': Flags.string({
|
|
62
|
+
char: 'm',
|
|
63
|
+
description: 'Directory containing .permissionset-meta.xml files. If not set, scans entire project for **/*.permissionset-meta.xml',
|
|
64
|
+
}),
|
|
65
|
+
outputfile: Flags.string({
|
|
66
|
+
char: 'f',
|
|
67
|
+
description: 'Force the path and name of output report file. Must end with .csv',
|
|
68
|
+
}),
|
|
69
|
+
debug: Flags.boolean({
|
|
70
|
+
char: 'd',
|
|
71
|
+
default: false,
|
|
72
|
+
description: messages.getMessage('debugMode'),
|
|
73
|
+
}),
|
|
74
|
+
websocket: Flags.string({
|
|
75
|
+
description: messages.getMessage('websocket'),
|
|
76
|
+
}),
|
|
77
|
+
skipauth: Flags.boolean({
|
|
78
|
+
description: 'Skip authentication check when a default username is required',
|
|
79
|
+
}),
|
|
80
|
+
'target-org': requiredOrgFlagWithDeprecations,
|
|
81
|
+
};
|
|
82
|
+
static requiresProject = true;
|
|
83
|
+
static triggerNotification = true;
|
|
84
|
+
debugMode = false;
|
|
85
|
+
outputFile;
|
|
86
|
+
outputFilesRes = {};
|
|
87
|
+
minimalPermSets = [];
|
|
88
|
+
totalCount = 0;
|
|
89
|
+
errorCount = 0;
|
|
90
|
+
statusCode = 0;
|
|
91
|
+
/* jscpd:ignore-end */
|
|
92
|
+
/**
|
|
93
|
+
* Count permission-granting elements in a parsed PermissionSet XML object.
|
|
94
|
+
* Uses structure to differentiate: leaf elements (primitives/arrays of primitives) are metadata-only;
|
|
95
|
+
* nested elements (objects/arrays of objects) are actual permissions. No hard-coded element names.
|
|
96
|
+
*/
|
|
97
|
+
countPermissionElements(psObj) {
|
|
98
|
+
if (!psObj || typeof psObj !== 'object') {
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
let count = 0;
|
|
102
|
+
for (const [key, value] of Object.entries(psObj)) {
|
|
103
|
+
const elementName = key.replace(/^[^:]+:/, ''); // strip namespace prefix if present
|
|
104
|
+
if (XML2JS_RESERVED_KEYS.has(elementName)) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (!isPermissionElementValue(value)) {
|
|
108
|
+
continue; // leaf/primitive element - metadata only
|
|
109
|
+
}
|
|
110
|
+
if (Array.isArray(value)) {
|
|
111
|
+
count += value.length;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
count += 1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return count;
|
|
118
|
+
}
|
|
119
|
+
async run() {
|
|
120
|
+
const { flags } = await this.parse(DiagnoseMinimalPermsets);
|
|
121
|
+
this.debugMode = flags.debug || false;
|
|
122
|
+
this.outputFile = flags.outputfile || null;
|
|
123
|
+
const threshold = flags.threshold ??
|
|
124
|
+
parseInt(getEnvVar('MINIMAL_PERMSETS_THRESHOLD') || String(DEFAULT_MINIMAL_PERMSETS_THRESHOLD), 10);
|
|
125
|
+
if (!Number.isFinite(threshold) || threshold < 0) {
|
|
126
|
+
throw new Error(`Invalid MINIMAL_PERMSETS_THRESHOLD or --threshold: must be a non-negative integer`);
|
|
127
|
+
}
|
|
128
|
+
const metadataDir = flags['metadata-dir'];
|
|
129
|
+
const cwd = process.cwd();
|
|
130
|
+
let psFiles;
|
|
131
|
+
if (metadataDir) {
|
|
132
|
+
const dirPath = path.isAbsolute(metadataDir) ? metadataDir : path.join(cwd, metadataDir);
|
|
133
|
+
if (!(await fs.pathExists(dirPath))) {
|
|
134
|
+
uxLog("error", this, c.red(`Metadata directory not found: ${dirPath}`));
|
|
135
|
+
process.exitCode = 1;
|
|
136
|
+
return { status: 1, message: 'Metadata directory not found', minimalPermSets: [] };
|
|
137
|
+
}
|
|
138
|
+
psFiles = await glob('*.permissionset-meta.xml', { cwd: dirPath, absolute: true });
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
psFiles = await glob('**/*.permissionset-meta.xml', { cwd, ignore: GLOB_IGNORE_PATTERNS, absolute: true });
|
|
142
|
+
}
|
|
143
|
+
uxLog("action", this, c.cyan(`Scanning ${psFiles.length} permission set(s) for minimal permissions (threshold: <= ${threshold})...`));
|
|
144
|
+
this.totalCount = psFiles.length;
|
|
145
|
+
this.minimalPermSets = [];
|
|
146
|
+
this.errorCount = 0;
|
|
147
|
+
for (const filePath of psFiles) {
|
|
148
|
+
const fileName = path.basename(filePath);
|
|
149
|
+
const cleanName = fileName.replace(/\.permissionset-meta\.xml$/, '');
|
|
150
|
+
try {
|
|
151
|
+
const parsed = await parseXmlFile(filePath);
|
|
152
|
+
const psRoot = parsed?.PermissionSet ?? parsed?.['sf:PermissionSet'] ?? Object.values(parsed || {})[0];
|
|
153
|
+
if (!psRoot) {
|
|
154
|
+
uxLog("warning", this, c.yellow(` Skipped ${fileName}: no PermissionSet root found`));
|
|
155
|
+
this.errorCount++;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const permissionCount = this.countPermissionElements(psRoot);
|
|
159
|
+
if (permissionCount <= threshold) {
|
|
160
|
+
const label = (Array.isArray(psRoot.label) ? psRoot.label[0] : psRoot.label) || cleanName;
|
|
161
|
+
const relPath = path.relative(cwd, filePath);
|
|
162
|
+
const isZeroValue = permissionCount === 0;
|
|
163
|
+
this.minimalPermSets.push({
|
|
164
|
+
Name: label,
|
|
165
|
+
FilePath: relPath,
|
|
166
|
+
PermissionCount: permissionCount,
|
|
167
|
+
severity: isZeroValue ? 'error' : 'warning',
|
|
168
|
+
severityIcon: getSeverityIcon(isZeroValue ? 'error' : 'warning'),
|
|
169
|
+
});
|
|
170
|
+
if (this.debugMode) {
|
|
171
|
+
uxLog("log", this, c.grey(` MINIMAL: ${label} (${fileName}) - ${permissionCount} permissions`));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
uxLog("warning", this, c.yellow(` ERROR parsing ${fileName}: ${e?.message || e}`));
|
|
177
|
+
this.errorCount++;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
this.minimalPermSets = sortArray(this.minimalPermSets, { by: ['Name'], order: ['asc'] });
|
|
181
|
+
// Display summary
|
|
182
|
+
uxLog("action", this, c.cyan('Results'));
|
|
183
|
+
uxLog("log", this, c.grey(`Found ${this.minimalPermSets.length} minimal permission set(s) (<= ${threshold} permissions) out of ${this.totalCount} total. Parse errors: ${this.errorCount}`));
|
|
184
|
+
if (this.minimalPermSets.length > 0) {
|
|
185
|
+
this.statusCode = 1;
|
|
186
|
+
uxLogTable(this, this.minimalPermSets);
|
|
187
|
+
uxLog("warning", this, c.yellow(`Consider consolidating these permission sets to reduce org complexity and improve maintainability.`));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
uxLog("success", this, c.green(`No minimal permission sets found (all have > ${threshold} permissions).`));
|
|
191
|
+
}
|
|
192
|
+
// Generate CSV report
|
|
193
|
+
this.outputFile = await generateReportPath('minimal-permission-sets', this.outputFile);
|
|
194
|
+
this.outputFilesRes = await generateCsvFile(this.minimalPermSets, this.outputFile, {
|
|
195
|
+
fileTitle: 'Minimal Permission Sets',
|
|
196
|
+
});
|
|
197
|
+
// Notifications
|
|
198
|
+
await setConnectionVariables(flags['target-org']?.getConnection());
|
|
199
|
+
const orgMarkdown = await getOrgMarkdown(flags['target-org']?.getConnection()?.instanceUrl);
|
|
200
|
+
const notifButtons = await getNotificationButtons();
|
|
201
|
+
let notifSeverity = 'log';
|
|
202
|
+
let notifText = `No minimal permission sets found in project for ${orgMarkdown} (threshold: ${threshold})`;
|
|
203
|
+
const notifAttachments = [];
|
|
204
|
+
if (this.minimalPermSets.length > 0) {
|
|
205
|
+
const zeroValueCount = this.minimalPermSets.filter((ps) => ps.PermissionCount === 0).length;
|
|
206
|
+
notifSeverity = zeroValueCount > 0 ? 'error' : 'warning';
|
|
207
|
+
notifText = `${this.minimalPermSets.length} minimal permission set(s) (<= ${threshold} permissions) in project for ${orgMarkdown}`;
|
|
208
|
+
if (zeroValueCount > 0) {
|
|
209
|
+
notifText = `${zeroValueCount} zero-value permission set(s) (0 permissions) and ${this.minimalPermSets.length - zeroValueCount} minimal in project for ${orgMarkdown}`;
|
|
210
|
+
}
|
|
211
|
+
const detailText = this.minimalPermSets
|
|
212
|
+
.slice(0, 20)
|
|
213
|
+
.map((ps) => {
|
|
214
|
+
const prefix = ps.PermissionCount === 0 ? '❌' : '⚠️';
|
|
215
|
+
return `${prefix} ${ps.Name}: ${ps.PermissionCount} permissions`;
|
|
216
|
+
})
|
|
217
|
+
.join('\n');
|
|
218
|
+
notifAttachments.push({
|
|
219
|
+
text: this.minimalPermSets.length > 20 ? `${detailText}\n... and ${this.minimalPermSets.length - 20} more` : detailText,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
await NotifProvider.postNotifications({
|
|
223
|
+
type: 'MINIMAL_PERMSETS',
|
|
224
|
+
text: notifText,
|
|
225
|
+
attachments: notifAttachments,
|
|
226
|
+
buttons: notifButtons,
|
|
227
|
+
severity: notifSeverity,
|
|
228
|
+
attachedFiles: this.outputFilesRes.xlsxFile ? [this.outputFilesRes.xlsxFile] : [],
|
|
229
|
+
logElements: this.minimalPermSets,
|
|
230
|
+
data: { metric: this.minimalPermSets.length, threshold },
|
|
231
|
+
metrics: {
|
|
232
|
+
minimalPermissionSets: this.minimalPermSets.length,
|
|
233
|
+
zeroValuePermissionSets: this.minimalPermSets.filter((ps) => ps.PermissionCount === 0).length,
|
|
234
|
+
totalPermissionSets: this.totalCount,
|
|
235
|
+
parseErrors: this.errorCount,
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
if ((this.argv || []).includes('minimalpermsets')) {
|
|
239
|
+
process.exitCode = this.statusCode;
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
status: this.statusCode,
|
|
243
|
+
threshold,
|
|
244
|
+
totalPermissionSets: this.totalCount,
|
|
245
|
+
minimalPermissionSets: this.minimalPermSets.length,
|
|
246
|
+
errorCount: this.errorCount,
|
|
247
|
+
minimalPermSets: this.minimalPermSets,
|
|
248
|
+
outputFile: this.outputFile,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=minimalpermsets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimalpermsets.js","sourceRoot":"","sources":["../../../../../src/commands/hardis/org/diagnose/minimalpermsets.ts"],"names":[],"mappings":"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"}
|
|
@@ -118,6 +118,12 @@ export default class MonitorAll extends SfCommand {
|
|
|
118
118
|
command: 'sf hardis:org:diagnose:unused-apex-classes',
|
|
119
119
|
frequency: 'weekly',
|
|
120
120
|
},
|
|
121
|
+
{
|
|
122
|
+
key: 'APEX_API_VERSION',
|
|
123
|
+
title: 'Detect Apex classes and triggers with deprecated API version',
|
|
124
|
+
command: 'sf hardis:org:diagnose:apex-api-version',
|
|
125
|
+
frequency: 'weekly',
|
|
126
|
+
},
|
|
121
127
|
{
|
|
122
128
|
key: 'CONNECTED_APPS',
|
|
123
129
|
title: 'Detect unused Connected Apps in an org',
|
|
@@ -142,6 +148,12 @@ export default class MonitorAll extends SfCommand {
|
|
|
142
148
|
command: 'sf hardis:org:diagnose:underusedpermsets',
|
|
143
149
|
frequency: 'weekly',
|
|
144
150
|
},
|
|
151
|
+
{
|
|
152
|
+
key: 'MINIMAL_PERMSETS',
|
|
153
|
+
title: 'Detect permission sets with minimal permissions in project',
|
|
154
|
+
command: 'sf hardis:org:diagnose:minimalpermsets',
|
|
155
|
+
frequency: 'weekly',
|
|
156
|
+
},
|
|
145
157
|
];
|
|
146
158
|
static description = `Monitor org, generate reports and sends notifications
|
|
147
159
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"all.js","sourceRoot":"","sources":["../../../../../src/commands/hardis/org/monitor/all.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"all.js","sourceRoot":"","sources":["../../../../../src/commands/hardis/org/monitor/all.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ export interface NotifButton {
|
|
|
6
6
|
}
|
|
7
7
|
export interface NotifMessage {
|
|
8
8
|
text: string;
|
|
9
|
-
type: "ACTIVE_USERS" | "ACTIVE_USERS_CRM_WEEKLY" | "ACTIVE_USERS_EXPERIENCE_MONTHLY" | "UNUSED_USERS" | "UNUSED_USERS_CRM_6_MONTHS" | "UNUSED_USERS_EXPERIENCE_6_MONTHS" | "AUDIT_TRAIL" | "APEX_TESTS" | "BACKUP" | "DEPLOYMENT" | "LEGACY_API" | "LICENSES" | "LINT_ACCESS" | "UNUSED_METADATAS" | "METADATA_STATUS" | "MISSING_ATTRIBUTES" | "SERVICENOW_REPORT" | "UNUSED_LICENSES" | "UNDERUSED_PERMSETS" | "UNUSED_APEX_CLASSES" | "CONNECTED_APPS" | "UNSECURED_CONNECTED_APPS" | "ORG_HEALTH_CHECK" | "ORG_INFO" | "ORG_LIMITS" | "RELEASE_UPDATES" | "AGENTFORCE_CONVERSATIONS" | "AGENTFORCE_FEEDBACK" | "APEX_ERROR" | "FLOW_ERROR";
|
|
9
|
+
type: "ACTIVE_USERS" | "ACTIVE_USERS_CRM_WEEKLY" | "ACTIVE_USERS_EXPERIENCE_MONTHLY" | "UNUSED_USERS" | "UNUSED_USERS_CRM_6_MONTHS" | "UNUSED_USERS_EXPERIENCE_6_MONTHS" | "AUDIT_TRAIL" | "APEX_TESTS" | "BACKUP" | "DEPLOYMENT" | "LEGACY_API" | "LICENSES" | "LINT_ACCESS" | "UNUSED_METADATAS" | "METADATA_STATUS" | "MISSING_ATTRIBUTES" | "SERVICENOW_REPORT" | "UNUSED_LICENSES" | "UNDERUSED_PERMSETS" | "MINIMAL_PERMSETS" | "UNUSED_APEX_CLASSES" | "APEX_API_VERSION" | "CONNECTED_APPS" | "UNSECURED_CONNECTED_APPS" | "ORG_HEALTH_CHECK" | "ORG_INFO" | "ORG_LIMITS" | "RELEASE_UPDATES" | "AGENTFORCE_CONVERSATIONS" | "AGENTFORCE_FEEDBACK" | "APEX_ERROR" | "FLOW_ERROR";
|
|
10
10
|
buttons?: NotifButton[];
|
|
11
11
|
attachments?: any[];
|
|
12
12
|
severity: NotifSeverity;
|