UNPKG

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
/* 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