sfdx-hardis 5.32.2-beta202505101931.0 → 5.34.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/CHANGELOG.md +10 -2
- package/lib/commands/hardis/misc/custom-label-translations.d.ts +21 -0
- package/lib/commands/hardis/misc/custom-label-translations.js +311 -0
- package/lib/commands/hardis/misc/custom-label-translations.js.map +1 -0
- package/lib/commands/hardis/org/diagnose/audittrail.d.ts +11 -0
- package/lib/commands/hardis/org/diagnose/audittrail.js +249 -158
- package/lib/commands/hardis/org/diagnose/audittrail.js.map +1 -1
- package/lib/common/aiProvider/promptTemplates.js +1 -1
- package/lib/common/aiProvider/promptTemplates.js.map +1 -1
- package/lib/common/utils/apiUtils.js +22 -2
- package/lib/common/utils/apiUtils.js.map +1 -1
- package/oclif.manifest.json +254 -164
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,10 +4,18 @@
|
|
|
4
4
|
|
|
5
5
|
Note: Can be used with `sfdx plugins:install sfdx-hardis@beta` and docker image `hardisgroupcom/sfdx-hardis@beta`
|
|
6
6
|
|
|
7
|
+
## [5.34.0] 2025-05-13
|
|
8
|
+
|
|
9
|
+
- [hardis:org:diagnose:audittrail](https://sfdx-hardis.cloudity.com/hardis/org/diagnose/audittrail/): Add audit Custom Setting values updates
|
|
10
|
+
- Improve SOQL query functions by adding warning logs for record limits and removing redundant warning handling
|
|
11
|
+
- New command [hardis:misc:custom-label-translations](https://sfdx-hardis.cloudity.com/hardis/misc/custom-label-translations/): Extract selected custom labels, or of a given Lightning Web Component (LWC), from all language translation files. This command generates translation files ('*.translation - meta.xml') for each language already retrieved in the current project, containing only the specified custom labels.
|
|
12
|
+
|
|
13
|
+
## [5.33.0] 2025-05-10
|
|
14
|
+
|
|
7
15
|
- [hardis:doc:project2markdown](https://sfdx-hardis.cloudity.com/hardis/doc/project2markdown/): Allow to use ollama, Anthropic and Gemini LLMs, through langchainJs
|
|
8
16
|
- sfdx-hardis prompt templates enhancements:
|
|
9
|
-
- Add prompt templates in online documentation
|
|
10
|
-
- Allow to locally override prompt templates text in `prompt-templates/${templateName}.txt`
|
|
17
|
+
- Add [prompt templates](https://sfdx-hardis.cloudity.com/salesforce-ai-prompts/#available-prompt-templates) in online documentation
|
|
18
|
+
- Allow to locally [override prompt templates](https://sfdx-hardis.cloudity.com/salesforce-ai-prompts/#overriding-prompts) text in `config/prompt-templates/${templateName}.txt`
|
|
11
19
|
- Rewrite old prompt templates
|
|
12
20
|
- Improve VsCode workspace configuration to avoid performance issues
|
|
13
21
|
- Upgrade npm dependencies
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
import { AnyJson } from '@salesforce/ts-types';
|
|
3
|
+
export default class CustomLabelTranslations extends SfCommand<any> {
|
|
4
|
+
static title: string;
|
|
5
|
+
static description: string;
|
|
6
|
+
static examples: string[];
|
|
7
|
+
private outputDirPrefix;
|
|
8
|
+
static flags: any;
|
|
9
|
+
static requiresProject: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Extract custom label names from LWC JS files
|
|
12
|
+
*/
|
|
13
|
+
private extractLabelsFromLwc;
|
|
14
|
+
run(): Promise<AnyJson>;
|
|
15
|
+
static promptCustomLabels(): Promise<any>;
|
|
16
|
+
static promptLwcComponent(): Promise<any>;
|
|
17
|
+
static promptExtractionMethod(): Promise<{
|
|
18
|
+
type: any;
|
|
19
|
+
values: any;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
2
|
+
import c from "chalk";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import fs from "fs-extra";
|
|
5
|
+
import { Messages } from '@salesforce/core';
|
|
6
|
+
import { isCI, uxLog } from '../../../common/utils/index.js';
|
|
7
|
+
import { prompts } from '../../../common/utils/prompts.js';
|
|
8
|
+
import { WebSocketClient } from '../../../common/websocketClient.js';
|
|
9
|
+
import { parseStringPromise, Builder } from 'xml2js';
|
|
10
|
+
import { GLOB_IGNORE_PATTERNS } from '../../../common/utils/projectUtils.js';
|
|
11
|
+
import { glob } from 'glob';
|
|
12
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
13
|
+
const messages = Messages.loadMessages('sfdx-hardis', 'org');
|
|
14
|
+
export default class CustomLabelTranslations extends SfCommand {
|
|
15
|
+
static title = 'Custom Label Translations';
|
|
16
|
+
static description = `Extract selected custom labels, or of a given Lightning Web Component (LWC), from all language translation files. This command generates translation files ('*.translation - meta.xml') for each language already retrieved in the current project, containing only the specified custom labels.`;
|
|
17
|
+
static examples = [
|
|
18
|
+
'$ sf hardis:misc:custom-label-translations --label CustomLabelName',
|
|
19
|
+
'$ sf hardis:misc:custom-label-translations --label Label1,Label2',
|
|
20
|
+
'$ sf hardis:misc:custom-label-translations --lwc MyComponent'
|
|
21
|
+
];
|
|
22
|
+
outputDirPrefix = 'extract-';
|
|
23
|
+
static flags = {
|
|
24
|
+
label: Flags.string({
|
|
25
|
+
char: 'l',
|
|
26
|
+
description: 'Developer name(s) of the custom label(s), comma-separated',
|
|
27
|
+
}),
|
|
28
|
+
lwc: Flags.string({
|
|
29
|
+
char: 'c',
|
|
30
|
+
description: 'Developer name of the Lightning Web Component',
|
|
31
|
+
}),
|
|
32
|
+
debug: Flags.boolean({
|
|
33
|
+
char: 'd',
|
|
34
|
+
default: false,
|
|
35
|
+
description: messages.getMessage('debugMode'),
|
|
36
|
+
}),
|
|
37
|
+
websocket: Flags.string({
|
|
38
|
+
description: messages.getMessage('websocket'),
|
|
39
|
+
}),
|
|
40
|
+
skipauth: Flags.boolean({
|
|
41
|
+
description: 'Skip authentication check when a default username is required',
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
// Set this to true if your command requires a project workspace; 'requiresProject' is false by default
|
|
45
|
+
static requiresProject = true;
|
|
46
|
+
/**
|
|
47
|
+
* Extract custom label names from LWC JS files
|
|
48
|
+
*/
|
|
49
|
+
async extractLabelsFromLwc(lwcName, debugMode) {
|
|
50
|
+
uxLog(this, c.grey(`Looking for LWC '${lwcName}' JS files...`));
|
|
51
|
+
const lwcFiles = await glob(`**/lwc/${lwcName}/**/*.js`);
|
|
52
|
+
if (lwcFiles.length === 0) {
|
|
53
|
+
throw new Error(`No JS files found for LWC '${lwcName}'`);
|
|
54
|
+
}
|
|
55
|
+
uxLog(this, c.grey(`Found ${lwcFiles.length} JS files for component '${lwcName}'`));
|
|
56
|
+
const labelNames = new Set();
|
|
57
|
+
const labelImportRegex = /@salesforce\/label\/c\.([a-zA-Z0-9_]+)/g;
|
|
58
|
+
for (const jsFile of lwcFiles) {
|
|
59
|
+
const content = await fs.readFile(jsFile, 'utf8');
|
|
60
|
+
let match;
|
|
61
|
+
while ((match = labelImportRegex.exec(content)) !== null) {
|
|
62
|
+
labelNames.add(match[1]);
|
|
63
|
+
}
|
|
64
|
+
if (debugMode) {
|
|
65
|
+
uxLog(this, c.grey(`Processed file: ${jsFile}`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const extractedLabels = Array.from(labelNames);
|
|
69
|
+
if (extractedLabels.length === 0) {
|
|
70
|
+
throw new Error(`No custom labels found in LWC '${lwcName}'`);
|
|
71
|
+
}
|
|
72
|
+
uxLog(this, c.grey(`Found ${extractedLabels.length} custom labels in LWC '${lwcName}': ${extractedLabels.join(', ')}`));
|
|
73
|
+
this.outputDirPrefix = lwcName;
|
|
74
|
+
return extractedLabels;
|
|
75
|
+
}
|
|
76
|
+
async run() {
|
|
77
|
+
const { flags } = await this.parse(CustomLabelTranslations);
|
|
78
|
+
const debugMode = flags.debug || false;
|
|
79
|
+
let labelNames = [];
|
|
80
|
+
if (flags.lwc) {
|
|
81
|
+
try {
|
|
82
|
+
labelNames = await this.extractLabelsFromLwc(flags.lwc, debugMode);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
uxLog(this, c.red(error.message));
|
|
86
|
+
return { success: false, message: error.message };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else if (flags.label) {
|
|
90
|
+
labelNames = flags.label.split(',').map(label => label.trim());
|
|
91
|
+
}
|
|
92
|
+
else if (!isCI) {
|
|
93
|
+
const selection = await CustomLabelTranslations.promptExtractionMethod();
|
|
94
|
+
if (selection.type == 'labels') {
|
|
95
|
+
labelNames = selection.values;
|
|
96
|
+
}
|
|
97
|
+
else if (selection.type == 'lwc') {
|
|
98
|
+
labelNames = await this.extractLabelsFromLwc(selection.values, debugMode);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!labelNames || labelNames.length === 0) {
|
|
102
|
+
const errorMsg = 'No custom labels specified. Use --label or --lwc flag.';
|
|
103
|
+
uxLog(this, c.red(errorMsg));
|
|
104
|
+
return { success: false, message: errorMsg };
|
|
105
|
+
}
|
|
106
|
+
uxLog(this, c.grey(`Processing custom labels: ${labelNames.join(', ')}`));
|
|
107
|
+
try {
|
|
108
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
109
|
+
const outputDir = path.join('extracted-translations', `${this.outputDirPrefix}-${timestamp}`);
|
|
110
|
+
await fs.ensureDir(outputDir);
|
|
111
|
+
const translationFiles = await glob('**/translations/*.translation-meta.xml');
|
|
112
|
+
if (translationFiles.length === 0) {
|
|
113
|
+
uxLog(this, c.yellow(`No translation files found in **/translations/`));
|
|
114
|
+
return { success: false, message: 'No translation files found' };
|
|
115
|
+
}
|
|
116
|
+
const results = {};
|
|
117
|
+
for (const translationFile of translationFiles) {
|
|
118
|
+
const languageCode = path.basename(translationFile).replace('.translation-meta.xml', '');
|
|
119
|
+
uxLog(this, c.grey(`Processing translation file for ${languageCode}...`));
|
|
120
|
+
const xmlContent = await fs.readFile(translationFile, 'utf8');
|
|
121
|
+
const parsedXml = await parseStringPromise(xmlContent, { explicitArray: false });
|
|
122
|
+
if (!parsedXml.Translations) {
|
|
123
|
+
uxLog(this, c.yellow(`Invalid translation file format: ${translationFile}`));
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (!parsedXml.Translations.customLabels) {
|
|
127
|
+
uxLog(this, c.yellow(`No custom labels found in ${translationFile}`));
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const customLabels = Array.isArray(parsedXml.Translations.customLabels)
|
|
131
|
+
? parsedXml.Translations.customLabels
|
|
132
|
+
: [parsedXml.Translations.customLabels];
|
|
133
|
+
const matchedLabels = customLabels.filter(label => labelNames.includes(label.name));
|
|
134
|
+
if (matchedLabels.length === 0) {
|
|
135
|
+
uxLog(this, c.yellow(`No matching custom labels found in ${languageCode}`));
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const newXml = {
|
|
139
|
+
Translations: {
|
|
140
|
+
$: { xmlns: "http://soap.sforce.com/2006/04/metadata" },
|
|
141
|
+
customLabels: matchedLabels
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const builder = new Builder({
|
|
145
|
+
xmldec: { version: '1.0', encoding: 'UTF-8' },
|
|
146
|
+
renderOpts: { pretty: true, indent: ' ', newline: '\n' }
|
|
147
|
+
});
|
|
148
|
+
const outputXml = builder.buildObject(newXml);
|
|
149
|
+
const outputFile = path.join(outputDir, `${languageCode}.translation-meta.xml`);
|
|
150
|
+
await fs.writeFile(outputFile, outputXml);
|
|
151
|
+
results[languageCode] = {
|
|
152
|
+
file: outputFile,
|
|
153
|
+
matchedLabels: matchedLabels.length
|
|
154
|
+
};
|
|
155
|
+
if (debugMode) {
|
|
156
|
+
uxLog(this, c.grey(`Found ${matchedLabels.length} labels in ${languageCode}:`));
|
|
157
|
+
matchedLabels.forEach(label => {
|
|
158
|
+
uxLog(this, c.grey(` ${label.name} = "${label.label}"`));
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const totalFiles = Object.keys(results).length;
|
|
163
|
+
if (totalFiles === 0) {
|
|
164
|
+
uxLog(this, c.yellow('No matching labels found in any translation file.'));
|
|
165
|
+
return { success: false, message: 'No matching labels found' };
|
|
166
|
+
}
|
|
167
|
+
uxLog(this, c.green(`Successfully extracted custom labels to ${outputDir}`));
|
|
168
|
+
uxLog(this, c.grey(`Processed ${totalFiles} translation files`));
|
|
169
|
+
WebSocketClient.requestOpenFile(outputDir);
|
|
170
|
+
// Return an object to be displayed with --json
|
|
171
|
+
return {
|
|
172
|
+
success: true,
|
|
173
|
+
outputDirectory: outputDir,
|
|
174
|
+
results: results
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
uxLog(this, c.red(`Error processing custom labels: ${err.message}`));
|
|
179
|
+
throw err;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
static async promptCustomLabels() {
|
|
183
|
+
try {
|
|
184
|
+
const customLabelsFiles = await glob('**/labels/CustomLabels.labels-meta.xml', { ignore: GLOB_IGNORE_PATTERNS });
|
|
185
|
+
if (customLabelsFiles.length == 0) {
|
|
186
|
+
throw new Error('No CustomLabels.labels-meta.xml was found');
|
|
187
|
+
}
|
|
188
|
+
const choices = [];
|
|
189
|
+
for (const customLabelsFile of customLabelsFiles) {
|
|
190
|
+
const xmlContent = await fs.readFile(customLabelsFile, 'utf8');
|
|
191
|
+
const parsedXml = await parseStringPromise(xmlContent);
|
|
192
|
+
if (!parsedXml.CustomLabels || !parsedXml.CustomLabels.labels) {
|
|
193
|
+
throw new Error('No custom labels found in the file');
|
|
194
|
+
}
|
|
195
|
+
const labels = Array.isArray(parsedXml.CustomLabels.labels)
|
|
196
|
+
? parsedXml.CustomLabels.labels
|
|
197
|
+
: [parsedXml.CustomLabels.labels];
|
|
198
|
+
labels.sort((a, b) => {
|
|
199
|
+
const nameA = a.fullName ? a.fullName[0] : a.name ? a.name[0] : '';
|
|
200
|
+
const nameB = b.fullName ? b.fullName[0] : b.name ? b.name[0] : '';
|
|
201
|
+
return nameA.localeCompare(nameB);
|
|
202
|
+
});
|
|
203
|
+
labels.map(label => {
|
|
204
|
+
const name = label.fullName ? label.fullName[0] : label.name ? label.name[0] : '';
|
|
205
|
+
const value = label.value ? label.value[0] : '';
|
|
206
|
+
const shortDesc = value.length > 40 ? value.substring(0, 40) + '...' : value;
|
|
207
|
+
choices.push({
|
|
208
|
+
value: name,
|
|
209
|
+
title: name,
|
|
210
|
+
description: shortDesc
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
const labelSelectRes = await prompts({
|
|
215
|
+
type: 'multiselect',
|
|
216
|
+
message: 'Please select the Custom Labels you want to extract from translations',
|
|
217
|
+
choices: choices
|
|
218
|
+
});
|
|
219
|
+
return labelSelectRes.value;
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
console.error('Error while processing custom labels:', err.message);
|
|
223
|
+
throw err;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
static async promptLwcComponent() {
|
|
227
|
+
try {
|
|
228
|
+
const lwcMetaFiles = await glob('**/lwc/*/*.js-meta.xml');
|
|
229
|
+
if (lwcMetaFiles.length === 0) {
|
|
230
|
+
throw new Error('No Lightning Web Components found in the project');
|
|
231
|
+
}
|
|
232
|
+
const componentsInfo = [];
|
|
233
|
+
for (const metaFile of lwcMetaFiles) {
|
|
234
|
+
try {
|
|
235
|
+
const xmlContent = await fs.readFile(metaFile, 'utf8');
|
|
236
|
+
const parsedXml = await parseStringPromise(xmlContent);
|
|
237
|
+
const pathParts = metaFile.split('/');
|
|
238
|
+
const componentName = pathParts[pathParts.length - 1].replace('.js-meta.xml', '');
|
|
239
|
+
let masterLabel = componentName;
|
|
240
|
+
if (parsedXml.LightningComponentBundle &&
|
|
241
|
+
parsedXml.LightningComponentBundle.masterLabel &&
|
|
242
|
+
parsedXml.LightningComponentBundle.masterLabel.length > 0) {
|
|
243
|
+
masterLabel = parsedXml.LightningComponentBundle.masterLabel[0];
|
|
244
|
+
}
|
|
245
|
+
componentsInfo.push({
|
|
246
|
+
name: componentName,
|
|
247
|
+
label: masterLabel,
|
|
248
|
+
path: metaFile
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
console.warn(`Could not parse meta file: ${metaFile}`, err.message);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
componentsInfo.sort((a, b) => a.name.localeCompare(b.name));
|
|
256
|
+
const choices = componentsInfo.map(component => ({
|
|
257
|
+
value: component.name,
|
|
258
|
+
title: component.label,
|
|
259
|
+
description: `Name: ${component.name}`
|
|
260
|
+
}));
|
|
261
|
+
const componentSelectRes = await prompts({
|
|
262
|
+
type: 'select',
|
|
263
|
+
name: 'value',
|
|
264
|
+
message: 'Select a Lightning Web Component to extract custom labels from',
|
|
265
|
+
choices: choices
|
|
266
|
+
});
|
|
267
|
+
return componentSelectRes.value;
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
console.error('Error while finding LWC components:', err.message);
|
|
271
|
+
throw err;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
static async promptExtractionMethod() {
|
|
275
|
+
try {
|
|
276
|
+
const methodSelectRes = await prompts({
|
|
277
|
+
type: 'select',
|
|
278
|
+
name: 'method',
|
|
279
|
+
message: 'How would you like to extract custom label translations?',
|
|
280
|
+
choices: [
|
|
281
|
+
{
|
|
282
|
+
value: 'labels',
|
|
283
|
+
title: 'Select specific custom labels',
|
|
284
|
+
description: 'Choose one or more custom labels from the full list'
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
value: 'lwc',
|
|
288
|
+
title: 'Extract from a Lightning Web Component',
|
|
289
|
+
description: 'Find all custom labels used in a specific LWC'
|
|
290
|
+
}
|
|
291
|
+
]
|
|
292
|
+
});
|
|
293
|
+
let values;
|
|
294
|
+
if (methodSelectRes.method === 'labels') {
|
|
295
|
+
values = await CustomLabelTranslations.promptCustomLabels();
|
|
296
|
+
}
|
|
297
|
+
else if (methodSelectRes.method === 'lwc') {
|
|
298
|
+
values = await CustomLabelTranslations.promptLwcComponent();
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
type: methodSelectRes.method,
|
|
302
|
+
values: values
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
catch (err) {
|
|
306
|
+
console.error('Error during extraction method selection:', err.message);
|
|
307
|
+
throw err;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=custom-label-translations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-label-translations.js","sourceRoot":"","sources":["../../../../src/commands/hardis/misc/custom-label-translations.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,19 @@ export default class DiagnoseAuditTrail extends SfCommand<any> {
|
|
|
10
10
|
protected lastNdays: number | undefined;
|
|
11
11
|
protected allowedSectionsActions: {};
|
|
12
12
|
protected debugMode: boolean;
|
|
13
|
+
protected suspectRecords: any[];
|
|
14
|
+
protected suspectUsers: any[];
|
|
15
|
+
protected suspectUsersAndActions: any;
|
|
16
|
+
protected suspectActions: any[];
|
|
17
|
+
protected severityIconLog: string;
|
|
18
|
+
protected severityIconWarning: string;
|
|
13
19
|
protected auditTrailRecords: any[];
|
|
14
20
|
protected outputFile: any;
|
|
15
21
|
protected outputFilesRes: any;
|
|
16
22
|
run(): Promise<AnyJson>;
|
|
23
|
+
private queryAuditTrail;
|
|
24
|
+
private handleCustomSettingsAudit;
|
|
25
|
+
private initializeAllowedSectionsActions;
|
|
26
|
+
private manageAuditTimeframe;
|
|
27
|
+
private manageExcludedUsers;
|
|
17
28
|
}
|