UNPKG

lit-xml

Version:

Burning your XML documents to the ground? Yes please. In the mean time, let's use lit-xml.

1 lines 7.83 kB
{"version":3,"sources":["../src/index.ts","../src/validators.ts","../src/invalid-xml-error.ts","../src/xml-helpers.ts","../src/xml-fragment.ts","../src/create-lit-xml.ts"],"sourcesContent":["import * as validators from './validators';\nexport * from './create-lit-xml';\nexport * from './invalid-xml-error';\nexport * from './validator';\nexport * from './xml-fragment';\nexport { validators };\n","import { XMLValidator } from 'fast-xml-parser';\nimport { InvalidXmlError } from './invalid-xml-error';\n\nexport function isWellFormed(xml: string) {\n const validationResult = XMLValidator.validate(xml);\n if (validationResult !== true) {\n throw new InvalidXmlError(validationResult.err.line, validationResult.err.msg, xml);\n }\n}\n","export class InvalidXmlError extends Error {\n constructor(\n line: number,\n message: string,\n public xmlDocument: string,\n ) {\n super(`Error on line ${line}: ${message}`);\n }\n}\n","import { XmlFragment } from './xml-fragment';\nimport { LitXmlOptions } from './lit-xml-options';\nimport { X2jOptions, XmlBuilderOptions, XMLParser, XMLBuilder } from 'fast-xml-parser';\n\nexport function valueToString(value: unknown): string {\n if (value instanceof XmlFragment) {\n return value.toStringRaw();\n }\n if (value === null) {\n return 'null';\n }\n if (value === undefined) {\n return '';\n }\n if (isJsonSerializable(value)) {\n return sanitize(value.toJSON());\n }\n if (Array.isArray(value)) {\n return value.map(valueToString).join('');\n }\n // eslint-disable-next-line\n return sanitize((value as any).toString());\n}\n\nfunction isJsonSerializable(value: unknown): value is { toJSON(): string } {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return Boolean(value) && typeof (value as any).toJSON === 'function';\n}\n\nconst fastXmlOptions: Partial<XmlBuilderOptions & X2jOptions> = {\n attributeNamePrefix: '',\n attributesGroupName: '$attr', //default is 'false'\n textNodeName: '#text',\n ignoreAttributes: false,\n removeNSPrefix: false,\n allowBooleanAttributes: false,\n suppressBooleanAttributes: false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true,\n cdataPropName: '__cdata', //default is 'false'\n suppressEmptyNode: true,\n};\n\nexport function format(xml: string, { format, indent }: Pick<LitXmlOptions, 'format' | 'indent'>): string {\n if (format) {\n const indentBy = new Array(indent).fill(' ').join('');\n const xmlAsJson: unknown = new XMLParser(fastXmlOptions).parse(xml, fastXmlOptions);\n return new XMLBuilder({ ...fastXmlOptions, format, indentBy }).build(xmlAsJson) as string;\n } else {\n return xml;\n }\n}\n\nconst XML_ESCAPE_MAP = Object.freeze({\n ['&']: '&amp;',\n [\"'\"]: '&apos;',\n ['\"']: '&quot;',\n ['<']: '&lt;',\n ['>']: '&gt;',\n});\n\nconst XML_SPECIAL_CHAR_REGEX = new RegExp(`([${Object.keys(XML_ESCAPE_MAP).join('')}])`, 'g');\n\n/**\n * Escapes XML characters\n * \" => &quot;\n * ' => &apos;\n * < => &lt;\n * > => &gt;\n * & => &amp;\n * @see https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents#answer-1091953\n * @param text the input text to be escaped\n */\nexport function sanitize(text: string) {\n return text.replace(XML_SPECIAL_CHAR_REGEX, (_match, char: keyof typeof XML_ESCAPE_MAP) => XML_ESCAPE_MAP[char]);\n}\n","import { valueToString, format } from './xml-helpers';\nimport { LitXmlOptions } from './lit-xml-options';\n\nexport class XmlFragment {\n constructor(\n private xmlLiterals: TemplateStringsArray,\n private values: unknown[],\n private options: LitXmlOptions,\n ) {}\n\n public toString(): string {\n const xml = this.toStringRaw();\n this.options.validators.forEach((validator) => validator(xml));\n return format(xml, this.options);\n }\n\n /**\n * @internal\n */\n public toStringRaw() {\n let stringBuilder = '';\n for (let i = 0; i < this.values.length; i++) {\n stringBuilder = stringBuilder.concat(this.xmlLiterals[i], valueToString(this.values[i]));\n }\n return stringBuilder + this.xmlLiterals[this.xmlLiterals.length - 1];\n }\n}\n","import { LitXmlOptions } from './lit-xml-options';\nimport { XmlFragment } from './xml-fragment';\n\nconst DEFAULT_OPTIONS: Readonly<LitXmlOptions> = {\n format: false,\n indent: 2,\n validators: [],\n strictTemplateValues: false,\n};\n\nexport type XmlPrimitive = string | number | boolean | bigint | XmlFragment | XmlFragment[];\n\nexport type XmlTemplateLiteralTag<T> = (xmlLiterals: TemplateStringsArray, ...values: T[]) => XmlFragment;\n\nexport type XmlTemplateLiteral = XmlTemplateLiteralTag<unknown>;\nexport type StrictXmlTemplateLiteral = XmlTemplateLiteralTag<XmlPrimitive>;\n\nexport function createLitXml<T extends Partial<LitXmlOptions>>(\n overrideOptions?: T,\n): XmlTemplateLiteralTag<T extends { strictTemplateValues: true } ? XmlPrimitive : unknown> {\n const options = Object.freeze({ ...DEFAULT_OPTIONS, ...overrideOptions });\n return function xml(xmlLiterals: TemplateStringsArray, ...values: unknown[]): XmlFragment {\n return new XmlFragment(xmlLiterals, values, options);\n };\n}\ncreateLitXml.inject = ['lit-xml-options'] as const;\n\nexport const xml = createLitXml();\n"],"mappings":"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","names":["xml","import_fast_xml_parser","xml","format","xml","xml"]}