@nodecfdi/cfdi-cleaner
Version:
Librería para limpiar comprobantes fiscales digitales v3.3 y v4.0
36 lines (35 loc) • 1.55 kB
JavaScript
import { isAttribute, NAMESPACE } from '@nodecfdi/cfdi-core';
import xpath from 'xpath';
import { namespaceXsi } from '#src/utils/constants';
/**
* This provides methods used for xml namespaces handling. It´s not meant to
* be used directly.
*/
export default class XmlNamespaceMethods {
*iterateNonReservedNamespaces(document) {
const namespaceNodes = xpath.evaluate("(//*|//@*)[local-name(.)='xmlns' or starts-with(name(), 'xmlns')]",
// @ts-expect-error misssing Node properties are not needed
document, null, 0, null);
let namespaceNode = namespaceNodes.iterateNext();
while (namespaceNode) {
if (!this.isNamespaceReserved(`${namespaceNode.nodeValue}`) && isAttribute(namespaceNode)) {
yield namespaceNode;
}
namespaceNode = namespaceNodes.iterateNext();
}
}
removeNamespaceNodeAttribute(namespaceNode) {
const { ownerElement, localName, nodeName } = namespaceNode;
/* istanbul ignore else -- For usage always is has attribute ns but for default bool is posible false @preserve */
if (ownerElement.hasAttributeNS(NAMESPACE.XMLNS, `${localName}`)) {
ownerElement.removeAttribute(nodeName);
}
}
isNamespaceReserved(namespace) {
const reservedNameSpaces = [NAMESPACE.XML, NAMESPACE.XMLNS, namespaceXsi];
return reservedNameSpaces.includes(namespace);
}
isNamespaceRelatedToSat(namespace) {
return namespace.startsWith('http://www.sat.gob.mx/');
}
}