{"version":3,"file":"dom-ARAHsg9Q.cjs","names":[],"sources":["../src/errors.ts","../src/result.ts","../src/sanitize.ts","../src/dom.ts"],"sourcesContent":["import type { IconlyError, IconlyErrorCode } from './types';\n\nexport const createIconlyError = (\n  code: IconlyErrorCode,\n  message: string,\n  cause?: unknown,\n): IconlyError => ({\n  code,\n  message,\n  cause,\n});\n","import type { IconlyError, Result } from './types';\n\nexport const ok = <T>(value: T): Result<T> => ({ ok: true, value });\n\nexport const err = <T = never>(error: IconlyError): Result<T> => ({ ok: false, error });\n","const DANGEROUS_TAGS = new Set(['script', 'foreignobject']);\nconst HREF_ATTRS = new Set(['href', 'xlink:href']);\nconst ANIMATION_TAGS = new Set([\n  'animate',\n  'animatemotion',\n  'animatetransform',\n  'animatecolor',\n  'set',\n]);\n\nconst isUnsafeHref = (value: string): boolean => {\n  const normalized = value.trim().replace(/\\s+/g, '').toLowerCase();\n\n  return /^javascript:/.test(normalized) || /^data:text\\/html/.test(normalized);\n};\n\nconst targetsHrefAttribute = (node: Element): boolean => {\n  const target = node.getAttribute('attributeName')?.trim().toLowerCase();\n\n  return target === 'href' || target === 'xlink:href';\n};\n\nexport const prepareSvgData = (data: string, sanitize?: (svg: string) => string): string =>\n  sanitize ? sanitize(data) : data;\n\nexport const sanitizeSvgElement = (root: Element): void => {\n  const walk = (node: Element): void => {\n    const tagName = node.tagName.toLowerCase();\n\n    if (DANGEROUS_TAGS.has(tagName)) {\n      node.remove();\n      return;\n    }\n\n    if (ANIMATION_TAGS.has(tagName) && targetsHrefAttribute(node)) {\n      node.remove();\n      return;\n    }\n\n    for (const attr of [...node.attributes]) {\n      const name = attr.name.toLowerCase();\n\n      if (name.startsWith('on') || (HREF_ATTRS.has(name) && isUnsafeHref(attr.value))) {\n        node.removeAttribute(attr.name);\n      }\n    }\n\n    for (const child of [...node.children]) {\n      walk(child);\n    }\n  };\n\n  walk(root);\n};\n","import { createIconlyError } from './errors';\nimport { err, ok } from './result';\nimport { prepareSvgData, sanitizeSvgElement } from './sanitize';\nimport type { InsertSvgOptions, Result } from './types';\n\nexport const resolveContainer = (container?: string | HTMLElement): Result<HTMLElement> => {\n  if (typeof document === 'undefined') {\n    return err(\n      createIconlyError('container_invalid', 'Document is not available in this environment.'),\n    );\n  }\n\n  try {\n    if (typeof container === 'string') {\n      const found = document.querySelector(container);\n\n      if (!found || !(found instanceof HTMLElement)) {\n        return err(\n          createIconlyError('container_invalid', `Invalid container selector: \"${container}\".`),\n        );\n      }\n\n      return ok(found);\n    }\n\n    if (container) {\n      return ok(container);\n    }\n\n    const fallback = document.body ?? document.documentElement;\n\n    if (!fallback) {\n      return err(createIconlyError('container_invalid', 'No valid container element found.'));\n    }\n\n    return ok(fallback);\n  } catch (error: unknown) {\n    return err(createIconlyError('container_invalid', 'Failed to resolve container.', error));\n  }\n};\n\nexport const insertSvg = (\n  container: HTMLElement,\n  data: string,\n  options?: InsertSvgOptions,\n): Result<void> => {\n  try {\n    const parser = new DOMParser();\n    const svgDoc = parser.parseFromString(prepareSvgData(data, options?.sanitize), 'image/svg+xml');\n    const parserError = svgDoc.querySelector('parsererror');\n\n    if (parserError) {\n      return err(\n        createIconlyError(\n          'parse_error',\n          `SVG parsing error: ${parserError.textContent ?? 'Unknown error'}`,\n        ),\n      );\n    }\n\n    const svgEl = svgDoc.documentElement;\n\n    if (svgEl.localName !== 'svg' || svgEl.namespaceURI !== 'http://www.w3.org/2000/svg') {\n      return err(createIconlyError('parse_error', 'The document root must be an SVG element.'));\n    }\n\n    sanitizeSvgElement(svgEl);\n\n    const ownerDocument = container.ownerDocument;\n    const imported = ownerDocument.importNode(svgEl, true);\n    const found = container.querySelector('[data-iconly=\"iconset\"]');\n    let iconSetDiv: HTMLElement | null =\n      found?.namespaceURI === 'http://www.w3.org/1999/xhtml' ? (found as HTMLElement) : null;\n\n    if (!iconSetDiv) {\n      iconSetDiv = ownerDocument.createElement('div');\n      iconSetDiv.setAttribute('data-iconly', 'iconset');\n      iconSetDiv.setAttribute('aria-hidden', 'true');\n      iconSetDiv.style.cssText = 'width: 0; height: 0; position: absolute; left: -9999px;';\n      container.appendChild(iconSetDiv);\n    }\n\n    iconSetDiv.replaceChildren(imported);\n\n    return ok(undefined);\n  } catch (error: unknown) {\n    return err(createIconlyError('parse_error', 'Failed to parse or insert SVG.', error));\n  }\n};\n"],"mappings":";;AAEA,MAAa,qBACX,MACA,SACA,WACiB;CACjB;CACA;CACA;AACF;;;;ACRA,MAAa,MAAS,WAAyB;CAAE,IAAI;CAAM;AAAM;AAEjE,MAAa,OAAkB,WAAmC;CAAE,IAAI;CAAO;AAAM;;;;ACJrF,MAAM,iCAAiB,IAAI,IAAI,CAAC,UAAU,eAAe,CAAC;AAC1D,MAAM,6BAAa,IAAI,IAAI,CAAC,QAAQ,YAAY,CAAC;AACjD,MAAM,iCAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,gBAAgB,UAA2B;CAC/C,MAAM,aAAa,MAAM,KAAK,CAAC,CAAC,QAAQ,QAAQ,EAAE,CAAC,CAAC,YAAY;CAEhE,OAAO,eAAe,KAAK,UAAU,KAAK,mBAAmB,KAAK,UAAU;AAC9E;AAEA,MAAM,wBAAwB,SAA2B;CACvD,MAAM,SAAS,KAAK,aAAa,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC,YAAY;CAEtE,OAAO,WAAW,UAAU,WAAW;AACzC;AAEA,MAAa,kBAAkB,MAAc,aAC3C,WAAW,SAAS,IAAI,IAAI;AAE9B,MAAa,sBAAsB,SAAwB;CACzD,MAAM,QAAQ,SAAwB;EACpC,MAAM,UAAU,KAAK,QAAQ,YAAY;EAEzC,IAAI,eAAe,IAAI,OAAO,GAAG;GAC/B,KAAK,OAAO;GACZ;EACF;EAEA,IAAI,eAAe,IAAI,OAAO,KAAK,qBAAqB,IAAI,GAAG;GAC7D,KAAK,OAAO;GACZ;EACF;EAEA,KAAK,MAAM,QAAQ,CAAC,GAAG,KAAK,UAAU,GAAG;GACvC,MAAM,OAAO,KAAK,KAAK,YAAY;GAEnC,IAAI,KAAK,WAAW,IAAI,KAAM,WAAW,IAAI,IAAI,KAAK,aAAa,KAAK,KAAK,GAC3E,KAAK,gBAAgB,KAAK,IAAI;EAElC;EAEA,KAAK,MAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,GACnC,KAAK,KAAK;CAEd;CAEA,KAAK,IAAI;AACX;;;;AChDA,MAAa,oBAAoB,cAA0D;CACzF,IAAI,OAAO,aAAa,aACtB,OAAO,IACL,kBAAkB,qBAAqB,gDAAgD,CACzF;CAGF,IAAI;EACF,IAAI,OAAO,cAAc,UAAU;GACjC,MAAM,QAAQ,SAAS,cAAc,SAAS;GAE9C,IAAI,CAAC,SAAS,EAAE,iBAAiB,cAC/B,OAAO,IACL,kBAAkB,qBAAqB,gCAAgC,UAAU,GAAG,CACtF;GAGF,OAAO,GAAG,KAAK;EACjB;EAEA,IAAI,WACF,OAAO,GAAG,SAAS;EAGrB,MAAM,WAAW,SAAS,QAAQ,SAAS;EAE3C,IAAI,CAAC,UACH,OAAO,IAAI,kBAAkB,qBAAqB,mCAAmC,CAAC;EAGxF,OAAO,GAAG,QAAQ;CACpB,SAAS,OAAgB;EACvB,OAAO,IAAI,kBAAkB,qBAAqB,gCAAgC,KAAK,CAAC;CAC1F;AACF;AAEA,MAAa,aACX,WACA,MACA,YACiB;CACjB,IAAI;EAEF,MAAM,SAAS,IADI,UACC,CAAC,CAAC,gBAAgB,eAAe,MAAM,SAAS,QAAQ,GAAG,eAAe;EAC9F,MAAM,cAAc,OAAO,cAAc,aAAa;EAEtD,IAAI,aACF,OAAO,IACL,kBACE,eACA,sBAAsB,YAAY,eAAe,iBACnD,CACF;EAGF,MAAM,QAAQ,OAAO;EAErB,IAAI,MAAM,cAAc,SAAS,MAAM,iBAAiB,8BACtD,OAAO,IAAI,kBAAkB,eAAe,2CAA2C,CAAC;EAG1F,mBAAmB,KAAK;EAExB,MAAM,gBAAgB,UAAU;EAChC,MAAM,WAAW,cAAc,WAAW,OAAO,IAAI;EACrD,MAAM,QAAQ,UAAU,cAAc,2BAAyB;EAC/D,IAAI,aACF,OAAO,iBAAiB,iCAAkC,QAAwB;EAEpF,IAAI,CAAC,YAAY;GACf,aAAa,cAAc,cAAc,KAAK;GAC9C,WAAW,aAAa,eAAe,SAAS;GAChD,WAAW,aAAa,eAAe,MAAM;GAC7C,WAAW,MAAM,UAAU;GAC3B,UAAU,YAAY,UAAU;EAClC;EAEA,WAAW,gBAAgB,QAAQ;EAEnC,OAAO,GAAG,MAAS;CACrB,SAAS,OAAgB;EACvB,OAAO,IAAI,kBAAkB,eAAe,kCAAkC,KAAK,CAAC;CACtF;AACF"}