{"version":3,"file":"Markdown.mjs","sources":["../../src/markdown/Markdown.tsx"],"sourcesContent":["import * as commonmark from 'commonmark';\nimport type { Node as MarkdownNode } from 'commonmark';\n\nimport { MarkdownNodeType } from '../common';\nimport { logActionRequired } from '../utilities';\n\nconst reader = new commonmark.Parser();\nconst writer = new commonmark.HtmlRenderer({ safe: true });\n\nconst NODE_TYPE_LIST = Object.values(MarkdownNodeType);\n\nexport type MarkdownProps = {\n  as?: React.ElementType;\n  config?: {\n    link?: Pick<React.ComponentPropsWithoutRef<'a'>, 'target'>;\n    paragraph?: Pick<React.ComponentPropsWithoutRef<'p'>, 'className'>;\n  };\n  className?: string;\n  children?: string;\n} & (\n  | {\n      allowList?: readonly `${MarkdownNodeType}`[];\n      blockList?: never;\n    }\n  | {\n      allowList?: never;\n      blockList?: readonly `${MarkdownNodeType}`[];\n    }\n);\n\nexport default function Markdown({\n  as: Element = 'div',\n  allowList,\n  blockList,\n  config,\n  className,\n  children,\n}: MarkdownProps) {\n  if (!children) {\n    return null;\n  }\n\n  const linkTarget = config?.link?.target ?? '_self';\n  const paragraphClass = config?.paragraph?.className ?? '';\n\n  if (allowList != null && blockList != null) {\n    logActionRequired(\n      'Markdown supports only one of `allowList` or `blockList` to be used at a time. `blockList` will be ignored.',\n    );\n  }\n\n  const parser = (nodes: string) => {\n    const parsed = reader.parse(nodes);\n    const toExclude =\n      allowList != null ? NODE_TYPE_LIST.filter((type) => !allowList.includes(type)) : blockList;\n    return toExclude != null ? stripNodes({ parsed, blockList: toExclude }) : parsed;\n  };\n\n  const createMarkup = () => {\n    const parsed = parser(children);\n    return writer\n      .render(parsed)\n      .replace(/<a href=\"/g, `<a target=\"${linkTarget}\" href=\"`)\n      .replace(/<p>/g, `<p class=\"${paragraphClass}\">`);\n  };\n\n  return <Element className={className} dangerouslySetInnerHTML={{ __html: createMarkup() }} />;\n}\n\nfunction stripNodes({ blockList, parsed }: { blockList: readonly string[]; parsed: MarkdownNode }) {\n  if (!parsed) {\n    return parsed;\n  }\n\n  const walker = parsed.walker();\n\n  for (let event = walker.next(); event != null; event = walker.next()) {\n    const { node } = event;\n    if (blockList.includes(node.type) && !event.entering) {\n      while (node.firstChild != null) {\n        node.insertBefore(node.firstChild);\n      }\n      node.unlink();\n    }\n  }\n  return parsed;\n}\n"],"names":["reader","commonmark","Parser","writer","HtmlRenderer","safe","NODE_TYPE_LIST","Object","values","MarkdownNodeType","Markdown","as","Element","allowList","blockList","config","className","children","linkTarget","link","target","paragraphClass","paragraph","logActionRequired","parser","nodes","parsed","parse","toExclude","filter","type","includes","stripNodes","createMarkup","render","replace","_jsx","dangerouslySetInnerHTML","__html","walker","event","next","node","entering","firstChild","insertBefore","unlink"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAMA,MAAM,GAAG,IAAIC,UAAU,CAACC,MAAM,EAAE;AACtC,MAAMC,MAAM,GAAG,IAAIF,UAAU,CAACG,YAAY,CAAC;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAE,CAAC;AAE1D,MAAMC,cAAc,GAAGC,MAAM,CAACC,MAAM,CAACC,gBAAgB,CAAC;AAqBxC,SAAUC,QAAQA,CAAC;EAC/BC,EAAE,EAAEC,OAAO,GAAG,KAAK;EACnBC,SAAS;EACTC,SAAS;EACTC,MAAM;EACNC,SAAS;AACTC,EAAAA;AAAQ,CACM,EAAA;EACd,IAAI,CAACA,QAAQ,EAAE;AACb,IAAA,OAAO,IAAI;AACb,EAAA;EAEA,MAAMC,UAAU,GAAGH,MAAM,EAAEI,IAAI,EAAEC,MAAM,IAAI,OAAO;EAClD,MAAMC,cAAc,GAAGN,MAAM,EAAEO,SAAS,EAAEN,SAAS,IAAI,EAAE;AAEzD,EAAA,IAAIH,SAAS,IAAI,IAAI,IAAIC,SAAS,IAAI,IAAI,EAAE;IAC1CS,iBAAiB,CACf,6GAA6G,CAC9G;AACH,EAAA;EAEA,MAAMC,MAAM,GAAIC,KAAa,IAAI;AAC/B,IAAA,MAAMC,MAAM,GAAG1B,MAAM,CAAC2B,KAAK,CAACF,KAAK,CAAC;IAClC,MAAMG,SAAS,GACbf,SAAS,IAAI,IAAI,GAAGP,cAAc,CAACuB,MAAM,CAAEC,IAAI,IAAK,CAACjB,SAAS,CAACkB,QAAQ,CAACD,IAAI,CAAC,CAAC,GAAGhB,SAAS;AAC5F,IAAA,OAAOc,SAAS,IAAI,IAAI,GAAGI,UAAU,CAAC;MAAEN,MAAM;AAAEZ,MAAAA,SAAS,EAAEc;KAAW,CAAC,GAAGF,MAAM;EAClF,CAAC;EAED,MAAMO,YAAY,GAAGA,MAAK;AACxB,IAAA,MAAMP,MAAM,GAAGF,MAAM,CAACP,QAAQ,CAAC;IAC/B,OAAOd,MAAM,CACV+B,MAAM,CAACR,MAAM,CAAC,CACdS,OAAO,CAAC,YAAY,EAAE,cAAcjB,UAAU,CAAA,QAAA,CAAU,CAAC,CACzDiB,OAAO,CAAC,MAAM,EAAE,CAAA,UAAA,EAAad,cAAc,CAAA,EAAA,CAAI,CAAC;EACrD,CAAC;EAED,oBAAOe,GAAA,CAACxB,OAAO,EAAA;AAACI,IAAAA,SAAS,EAAEA,SAAU;AAACqB,IAAAA,uBAAuB,EAAE;MAAEC,MAAM,EAAEL,YAAY;AAAE;AAAG,IAAG;AAC/F;AAEA,SAASD,UAAUA,CAAC;EAAElB,SAAS;AAAEY,EAAAA;AAAM,CAA0D,EAAA;EAC/F,IAAI,CAACA,MAAM,EAAE;AACX,IAAA,OAAOA,MAAM;AACf,EAAA;AAEA,EAAA,MAAMa,MAAM,GAAGb,MAAM,CAACa,MAAM,EAAE;EAE9B,KAAK,IAAIC,KAAK,GAAGD,MAAM,CAACE,IAAI,EAAE,EAAED,KAAK,IAAI,IAAI,EAAEA,KAAK,GAAGD,MAAM,CAACE,IAAI,EAAE,EAAE;IACpE,MAAM;AAAEC,MAAAA;AAAI,KAAE,GAAGF,KAAK;AACtB,IAAA,IAAI1B,SAAS,CAACiB,QAAQ,CAACW,IAAI,CAACZ,IAAI,CAAC,IAAI,CAACU,KAAK,CAACG,QAAQ,EAAE;AACpD,MAAA,OAAOD,IAAI,CAACE,UAAU,IAAI,IAAI,EAAE;AAC9BF,QAAAA,IAAI,CAACG,YAAY,CAACH,IAAI,CAACE,UAAU,CAAC;AACpC,MAAA;MACAF,IAAI,CAACI,MAAM,EAAE;AACf,IAAA;AACF,EAAA;AACA,EAAA,OAAOpB,MAAM;AACf;;;;"}