@salesforce/acu-pack
Version:
SFDX CLI Extensions
154 lines • 6.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const fs_1 = require("fs");
const utils_1 = require("./utils");
const sfdx_core_1 = require("./sfdx-core");
const constants_1 = require("./constants");
class MergeResult {
}
class XmlMerge {
/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types */
static async mergeXmlFiles(sourceXmlFile, destinationXmlFile, isPackageCompare, ux) {
let results = new MergeResult();
const logFilePath = path.join(path.dirname(destinationXmlFile), 'xml-merge.log');
try {
// Reset log file
await utils_1.default.deleteFile(logFilePath);
if (!(await utils_1.default.pathExists(sourceXmlFile))) {
await this.logMessage(`Source package does not exist: ${sourceXmlFile}`, logFilePath, ux);
return;
}
const source = await utils_1.default.readObjectFromXmlFile(sourceXmlFile);
await this.logMessage(`Parsed source package: ${sourceXmlFile}`, logFilePath, ux);
if (await utils_1.default.pathExists(destinationXmlFile)) {
const destination = await utils_1.default.readObjectFromXmlFile(destinationXmlFile);
await this.logMessage(`Parsed destination package: ${destinationXmlFile}`, logFilePath, ux);
results = this.mergeObjects(source, destination, isPackageCompare);
}
else if (isPackageCompare) {
await this.logMessage('Destination package does not exist.', logFilePath, ux);
return;
}
else {
await this.logMessage('Destination package does not exist - using source', logFilePath, ux);
results.destination = source;
}
if (!isPackageCompare) {
await utils_1.default.writeObjectToXmlFile(destinationXmlFile, results.destination);
await this.logMessage(`Merged package written: ${destinationXmlFile}`, logFilePath, ux);
}
else {
await utils_1.default.writeObjectToXmlFile(sourceXmlFile, results.source);
await utils_1.default.writeObjectToXmlFile(destinationXmlFile, results.destination);
await this.logMessage(`Packages written: ${sourceXmlFile} & ${destinationXmlFile}`, logFilePath, ux);
}
}
catch (err) {
await this.logMessage(err, logFilePath, ux);
}
/* eslint-disable-next-line @typescript-eslint/no-unsafe-return */
return results.destination;
}
/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types */
static async mergeXmlToFile(sourceXml, destinationXmlFile) {
let merged;
if (await utils_1.default.pathExists(destinationXmlFile)) {
const destination = await utils_1.default.readObjectFromXmlFile(destinationXmlFile);
merged = this.mergeObjects(sourceXml, destination).destination;
}
else {
merged = sourceXml;
}
await utils_1.default.writeObjectToXmlFile(destinationXmlFile, merged);
/* eslint-disable-next-line @typescript-eslint/no-unsafe-return */
return merged;
}
/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types */
static getType(pack, name) {
for (const type of pack.types) {
if (type.name[0] === name) {
return type;
}
}
return null;
}
/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types */
static async logMessage(message, logFile, ux) {
if (typeof message === 'string') {
await fs_1.promises.appendFile(logFile, `${message}${constants_1.default.EOL}`);
}
else {
await fs_1.promises.appendFile(logFile, `${JSON.stringify(message)}${constants_1.default.EOL}`);
}
if (ux) {
ux.log(message);
}
}
/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types */
static mergeObjects(source, destination, isPackageCompare) {
const result = new MergeResult();
result.source = source;
result.destination = destination ?? new Object(destination);
if (!result.source.Package) {
result.source['Package'] = {};
}
if (!result.source.Package.types) {
result.source.Package['types'] = [];
}
if (!result.destination.Package) {
result.destination['Package'] = {};
}
if (!result.destination.Package.types) {
result.destination.Package['types'] = [];
}
if (!result.destination.Package.version) {
result.destination.Package['version'] = result.source.Package.version;
}
for (const sType of result.source.Package.types) {
if (!sType.members) {
continue;
}
utils_1.default.sortArray(sType.members);
const dType = this.getType(result.destination.Package, sType.name[0]);
if (!dType || !dType.members) {
if (!isPackageCompare) {
result.destination.Package.types.push(sType);
}
continue;
}
const pops = [];
for (const sMem of sType.members) {
let dMem;
for (const memName of dType.members) {
if (sMem === memName) {
dMem = memName;
break;
}
}
if (!dMem) {
if (!isPackageCompare) {
dType.members.push(sMem);
}
}
else if (isPackageCompare) {
pops.push(dMem);
}
}
// remove all common types here
for (const pop of pops) {
sType.members.splice(sType.members.indexOf(pop), 1);
dType.members.splice(dType.members.indexOf(pop), 1);
}
utils_1.default.sortArray(dType.members);
}
// If we removed items we may need to minify
if (isPackageCompare) {
result.source = sfdx_core_1.SfdxCore.minifyPackage(result.source);
result.destination = sfdx_core_1.SfdxCore.minifyPackage(result.destination);
}
return result;
}
}
exports.default = XmlMerge;
//# sourceMappingURL=xml-merge.js.map