{"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"]}