sf-package-list
Version:
Convert Salesforce package.xml manifests to and from plain-text list format.
72 lines • 2.73 kB
JavaScript
import { parseXml } from './xmlParser.js';
function isElement(node) {
return typeof node !== 'string';
}
function getText(node) {
return node.children
.filter((child) => typeof child === 'string')
.join('')
.trim();
}
function parseTypesElement(typesEl) {
const children = typesEl.children.filter(isElement);
const nameEls = children.filter((el) => el.tagName === 'name');
const memberEls = children.filter((el) => el.tagName === 'members');
const otherEl = children.find((el) => el.tagName !== 'name' && el.tagName !== 'members');
if (otherEl) {
throw new Error(`unexpected element <${otherEl.tagName}> inside <types>`);
}
if (nameEls.length !== 1) {
throw new Error(`<types> must contain exactly one <name> element, found ${nameEls.length}`);
}
const name = getText(nameEls[0]);
if (!name) {
throw new Error('<types><name> element must not be empty');
}
if (memberEls.length === 0) {
throw new Error(`<types> for "${name}" must contain at least one <members> element`);
}
const members = memberEls.map((memberEl) => {
const member = getText(memberEl);
if (!member) {
throw new Error(`<types> for "${name}" contains an empty <members> element`);
}
return member;
});
return { name, members };
}
/**
* Parses a package.xml manifest's raw text into its types/members/version.
* Validates only that the document follows the Metadata API manifest structure
* (a single <Package> root containing <types>/<version> elements) -- metadata
* type names are not checked against the Salesforce metadata registry.
*/
export function parseManifestXml(xml) {
const roots = parseXml(xml);
if (roots.length !== 1 || roots[0].tagName !== 'Package') {
throw new Error('manifest must have a single <Package> root element');
}
const types = [];
let version = null;
let versionSeen = false;
for (const child of roots[0].children.filter(isElement)) {
if (child.tagName === 'types') {
types.push(parseTypesElement(child));
}
else if (child.tagName === 'version') {
if (versionSeen) {
throw new Error('<Package> must not contain more than one <version> element');
}
versionSeen = true;
version = getText(child);
if (!version) {
throw new Error('<Package><version> element must not be empty');
}
}
else {
throw new Error(`unexpected element <${child.tagName}> inside <Package>`);
}
}
return { types, version };
}
//# sourceMappingURL=parseManifest.js.map