sfdx-hardis
Version:
Swiss-army-knife Toolbox for Salesforce. Allows you to define a complete CD/CD Pipeline. Orchestrate base commands and assist users with interactive wizards
113 lines • 5.38 kB
JavaScript
/* jscpd:ignore-start */
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
import { Messages } from '@salesforce/core';
import c from 'chalk';
import fs from 'fs-extra';
import { glob } from 'glob';
import * as path from 'path';
import { uxLog } from '../../../../common/utils/index.js';
import { parseXmlFile } from '../../../../common/utils/xmlUtils.js';
import { getReportDirectory } from '../../../../config/index.js';
import { WebSocketClient } from '../../../../common/websocketClient.js';
import { GLOB_IGNORE_PATTERNS } from '../../../../common/utils/projectUtils.js';
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
const messages = Messages.loadMessages('sfdx-hardis', 'org');
export default class ExtractPermSetGroups extends SfCommand {
static title = 'Generate project documentation';
static description = `Generate markdown files with project documentation`;
static examples = ['$ sf hardis:doc:extract:permsetgroups'];
static flags = {
outputfile: Flags.string({
char: 'f',
description: 'Force the path and name of output report file. Must end with .csv',
}),
debug: Flags.boolean({
char: 'd',
default: false,
description: messages.getMessage('debugMode'),
}),
websocket: Flags.string({
description: messages.getMessage('websocket'),
}),
skipauth: Flags.boolean({
description: 'Skip authentication check when a default username is required',
}),
};
// Set this to true if your command requires a project workspace; 'requiresProject' is false by default
static requiresProject = true;
outputFile;
debugMode = false;
async run() {
const { flags } = await this.parse(ExtractPermSetGroups);
this.outputFile = flags.outputfile || null;
this.debugMode = flags.debug || false;
// Delete standard files when necessary
uxLog(this, c.cyan(`Generating CSV and Markdown with Permission Set Groups and their related Permission Sets`));
/* jscpd:ignore-end */
const psgList = [];
const globPatternPSG = process.cwd() + `/**/*.permissionsetgroup-meta.xml`;
const psgFiles = await glob(globPatternPSG, { ignore: GLOB_IGNORE_PATTERNS });
uxLog(this, c.grey(`Found ${psgFiles.length} permission set groups`));
for (const psgFile of psgFiles) {
const psgName = (psgFile.replace(/\\/g, '/').split('/').pop() || '').replace('.permissionsetgroup-meta.xml', '');
const psg = await parseXmlFile(psgFile);
const psgItem = {
name: psgName,
label: psg.PermissionSetGroup.label,
description: psg.PermissionSetGroup.description,
permissionSetsNames: psg.PermissionSetGroup.permissionSets,
};
psgList.push(psgItem);
}
// Build CSV
const csvLines = [];
const header = ['Permission set group', 'Permission sets'];
csvLines.push(header);
for (const psg of psgList) {
const psgLine = [psg.name];
psgLine.push(`"${psg.permissionSetsNames.join(',')}"`);
csvLines.push(psgLine);
}
// Build output CSV file
if (this.outputFile == null) {
// Default file in system temp directory if --outputfile not provided
const reportDir = await getReportDirectory();
this.outputFile = path.join(reportDir, 'permission-set-groups.csv');
}
else {
// Ensure directories to provided --outputfile are existing
await fs.ensureDir(path.dirname(this.outputFile));
}
try {
const csvText = csvLines.map((e) => e.join(',')).join('\n');
await fs.writeFile(this.outputFile, csvText, 'utf8');
uxLog(this, c.cyan(`Permission set groups CSV file generated in ${c.bold(c.green(this.outputFile))}`));
// Trigger command to open CSV file in VsCode extension
WebSocketClient.requestOpenFile(this.outputFile);
}
catch (e) {
uxLog(this, c.yellow('Error while generating CSV log file:\n' + e.message + '\n' + e.stack));
this.outputFile = null;
}
// Build markdown file
const mdPsg = ['# Permission set groups', '', '<!-- toc -->', '<!-- tocstop -->'];
for (const psg of psgList) {
mdPsg.push(...[`## ${psg.name}`, '', psg.label, '', psg.description, '']);
for (const psName of psg.permissionSetsNames) {
mdPsg.push(` - ${psName} `);
}
mdPsg.push('');
}
const docFile = 'docs/permission-set-groups.md';
await fs.ensureDir('docs');
const mdPsgText = mdPsg.join('\n');
// mdPsgText = toc.insert(mdPsgText);
await fs.writeFile(docFile, mdPsgText, 'utf8');
uxLog(this, c.cyan(`Permission set groups Markdown file generated in ${c.bold(c.green(docFile))}`));
// Trigger command to open CSV file in VsCode extension
WebSocketClient.requestOpenFile(docFile);
// Return an object to be displayed with --json
return { outputString: 'Permission set groups Documentation generated' };
}
}
//# sourceMappingURL=permsetgroups.js.map