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

76 lines 3.48 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 { GLOB_IGNORE_PATTERNS } from '../../../../common/utils/projectUtils.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('sfdx-hardis', 'org'); export default class CleanEmptyItems extends SfCommand { static title = 'Clean retrieved empty items in dx sources'; static description = 'Remove unwanted empty items within sfdx project sources'; static examples = ['$ sf hardis:project:clean:emptyitems']; static flags = { folder: Flags.string({ char: 'f', default: 'force-app', description: 'Root folder', }), 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; folder; debugMode = false; async run() { const { flags } = await this.parse(CleanEmptyItems); this.folder = flags.folder || './force-app'; this.debugMode = flags.debug || false; // Delete standard files when necessary uxLog(this, c.cyan(`Removing empty dx managed source files`)); /* jscpd:ignore-end */ const rootFolder = path.resolve(this.folder); const emptyConstraints = [ { globPattern: `/**/*.globalValueSetTranslation-meta.xml`, tags: ['GlobalValueSetTranslation', 'valueTranslation'], }, { globPattern: `/**/*.standardValueSet-meta.xml`, tags: ['StandardValueSet', 'standardValue'] }, { globPattern: `/**/*.sharingRules-meta.xml`, tags: ['SharingRules', 'sharingOwnerRules'] }, ]; let counter = 0; for (const emptyConstraint of emptyConstraints) { const findStandardValueSetPattern = rootFolder + emptyConstraint.globPattern; const matchingCustomFiles = await glob(findStandardValueSetPattern, { cwd: process.cwd(), ignore: GLOB_IGNORE_PATTERNS }); for (const matchingCustomFile of matchingCustomFiles) { const xmlContent = await parseXmlFile(matchingCustomFile); const tag1 = xmlContent[emptyConstraint.tags[0]]; if (!(tag1 && tag1[emptyConstraint.tags[1]])) { await fs.remove(matchingCustomFile); uxLog(this, c.cyan(`Removed empty item ${c.yellow(matchingCustomFile)}`)); counter++; } } } // Summary const msg = `Removed ${c.green(c.bold(counter))} hidden source items`; uxLog(this, c.cyan(msg)); // Return an object to be displayed with --json return { outputString: msg }; } } //# sourceMappingURL=emptyitems.js.map