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
96 lines • 4.41 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 { prompts } from '../../../common/utils/prompts.js';
import { WebSocketClient } from '../../../common/websocketClient.js';
import { appendPackageXmlFilesContent } 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 MergePackageXml extends SfCommand {
static title = 'Merge package.xml files';
static description = 'Select and merge package.xml files';
static examples = [
'$ sf hardis:package:mergexml',
'$ sf hardis:package:mergexml --folder packages --pattern /**/*.xml --result myMergedPackage.xml',
'$ sf hardis:package:mergexml --packagexmls "config/mypackage1.xml,config/mypackage2.xml,config/mypackage3.xml" --result myMergedPackage.xml',
];
static flags = {
folder: Flags.string({
char: 'f',
default: 'manifest',
description: 'Root folder',
}),
packagexmls: Flags.string({
char: 'p',
description: 'Comma separated list of package.xml files to merge. Will be prompted to user if not provided',
}),
pattern: Flags.string({
char: 'x',
default: '/**/*package*.xml',
description: 'Name criteria to list package.xml files',
}),
result: Flags.string({
char: 'r',
description: 'Result package.xml file name',
}),
debug: Flags.boolean({
default: false,
description: 'debug',
}),
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 = false;
folder;
pattern;
packageXmlFiles = [];
resultFileName;
debugMode = false;
async run() {
const { flags } = await this.parse(MergePackageXml);
this.folder = flags.folder || './manifest';
this.pattern = flags.pattern || '/**/*package*.xml';
this.packageXmlFiles = flags.packagexmls ? flags.packagexmls.split(',') : [];
this.resultFileName = flags.result || path.join(this.folder, 'package-merge.xml');
await fs.ensureDir(path.dirname(this.resultFileName));
this.debugMode = flags.debug || false;
/* jscpd:ignore-end */
// If packagexmls are not provided, prompt user
if (this.packageXmlFiles.length === 0) {
const rootFolder = path.resolve(this.folder);
const findPackageXmlPattern = rootFolder + this.pattern;
const matchingFiles = await glob(findPackageXmlPattern, { cwd: process.cwd(), ignore: GLOB_IGNORE_PATTERNS });
const filesSelectRes = await prompts({
type: 'multiselect',
name: 'files',
message: 'Please select the package.xml files you want to merge',
choices: matchingFiles.map((file) => {
const relativeFile = path.relative(process.cwd(), file);
return { title: relativeFile, value: relativeFile };
}),
});
this.packageXmlFiles = filesSelectRes.files;
}
// Process merge of package.xml files
await appendPackageXmlFilesContent(this.packageXmlFiles, this.resultFileName);
// Summary
const msg = `Merged ${c.green(c.bold(this.packageXmlFiles.length))} files into ${c.green(this.resultFileName)}`;
uxLog(this, c.cyan(msg));
// Trigger command to open files config file in VsCode extension
WebSocketClient.requestOpenFile(this.resultFileName);
// Return an object to be displayed with --json
return { outputString: msg };
}
}
//# sourceMappingURL=mergexml.js.map