import { XMLParser, XMLBuilder, XMLValidator, type EntityDecoderOptions, type X2jOptions, type XmlBuilderOptions, type validationOptions, } from '../../src/fxp.js'; const parseOpts: X2jOptions = {}; // The parser hands `setXmlVersion` the number it read off ``. const entityDecoder: EntityDecoderOptions = { setExternalEntities: () => {}, addInputEntities: () => {}, reset: () => {}, decode: (text: string) => text, setXmlVersion: (version: number) => { console.log(version.toFixed(1)); }, }; console.log(!!new XMLParser({ entityDecoder })); // A decoder typed for a string version would compare it against "1.1", which never matches the number it receives. type StringVersionAccepted = ((version: string) => void) extends EntityDecoderOptions['setXmlVersion'] ? true : false; const stringVersionAccepted: StringVersionAccepted = false; console.log(stringVersionAccepted); const XML = ` `; const parser = new XMLParser(parseOpts); const parsed = parser.parse(XML); console.log(!!parsed); // The metadata key indexes parsed nodes, so it has to be a primitive property key, not a boxed `Symbol`. const metaDataKey: PropertyKey = XMLParser.getMetaDataSymbol(); const metaDataNode = new XMLParser({ captureMetaData: true }).parse(XML).SomeElement; console.log(metaDataNode[metaDataKey], metaDataNode[XMLParser.getMetaDataSymbol()]); // Without `Symbol` in the environment the key falls back to a plain property name. type StringKeyAccepted = string extends ReturnType ? true : false; const stringKeyAccepted: StringKeyAccepted = true; console.log(stringKeyAccepted); const buildOpts: XmlBuilderOptions = {}; const builder = new XMLBuilder(buildOpts); const built = builder.build({ any_name: { person: { phone: [ 15555551313, 15555551212 ] } } }); console.log(!!built); const validateOpts: validationOptions = {}; const isValid = XMLValidator.validate(built, validateOpts); console.log(!!isValid);