Skip to content

Commit

Permalink
Merge pull request #17 from mcarvin8/fix/names
Browse files Browse the repository at this point in the history
ensure only 1 name in each types element and some eslint fixes
  • Loading branch information
mcarvin8 authored Nov 13, 2024
2 parents 6bb58f8 + c452034 commit 8b15f88
Showing 1 changed file with 17 additions and 15 deletions.
32 changes: 17 additions & 15 deletions src/helpers/parsePackage.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
/* eslint-disable no-param-reassign */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable no-await-in-loop */
import { Parser } from 'xml2js';

Expand All @@ -11,7 +9,7 @@ export async function parsePackageXml(xmlContent: string): Promise<SalesforcePac
const parser = new Parser();

// Parse the XML string to an object
const parsed: SalesforcePackageXml = (await parser.parseStringPromise(xmlContent)) as SalesforcePackageXml;
const parsed = (await parser.parseStringPromise(xmlContent)) as unknown as SalesforcePackageXml;

// Ensure the root <Package> exists
if (!parsed.Package) {
Expand All @@ -27,25 +25,29 @@ export async function parsePackageXml(xmlContent: string): Promise<SalesforcePac
return null;
}

// Normalize the structure if 'name' or 'version' are wrapped in arrays
if (parsed.Package?.types) {
parsed.Package.types.forEach((type) => {
if (Array.isArray(type.name)) {
type.name = type.name[0]; // Normalize to a single string if it's wrapped in an array
}
if (Array.isArray(type.members)) {
type.members = type.members.flat(); // Flatten in case members are nested
}
});
}
parsed.Package.types = parsed.Package.types.map((type) => {
// Validate that there is exactly one <name> element
if (!Array.isArray(type.name) || type.name.length !== 1 || typeof type.name[0] !== 'string') {
throw new Error('Invalid package.xml: Each <types> block must have exactly one <name> element.');
}
const name = type.name[0];
const members = Array.isArray(type.members) ? type.members.flat() : type.members;
return {
...type,
name,
members,
};
});

// Enforce a maximum of one <version> tag in the package.xml
if (parsed.Package && Array.isArray(parsed.Package.version)) {
if (parsed.Package.version.length > 1) {
return null; // Invalid structure, more than one <version> tag
}
// Convert to a single string if only one <version> tag is present
parsed.Package.version = parsed.Package.version[0];
if (Array.isArray(parsed.Package.version) && typeof parsed.Package.version[0] === 'string') {
parsed.Package.version = parsed.Package.version[0];
}
}

// Apply a type guard to safely assert the parsed content matches SalesforcePackageXml
Expand Down

0 comments on commit 8b15f88

Please sign in to comment.