{"version":3,"sources":["../../src/rte/index.ts","../../src/rte/to-html.ts","../../src/rte/utils.ts","../../src/rte/serializer.ts","../../src/rte/to-markdown.ts","../../src/rte/to-plaintext.ts","../../src/rte/from-html.ts","../../src/rte/transform.ts","../../src/rte/validate.ts"],"sourcesContent":["export { toHTML } from \"./to-html.js\"\nexport type { ToHTMLOptions } from \"./to-html.js\"\n\nexport { toMarkdown } from \"./to-markdown.js\"\nexport type { ToMarkdownOptions } from \"./to-markdown.js\"\n\nexport { toPlainText } from \"./to-plaintext.js\"\n\nexport { fromHTML } from \"./from-html.js\"\nexport type { FromHTMLOptions } from \"./from-html.js\"\n\nexport { transform } from \"./transform.js\"\n\nexport { validate } from \"./validate.js\"\n\nexport type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nexport type {\n  RTEHtmlToJsonElementTags,\n  RTEHtmlToJsonElementTagsAttributes,\n  RTEHtmlToJsonOptions,\n  RTEHtmlToJsonTextTags,\n  RTEJsonToHtmlAllowedEmptyAttributes,\n  RTEJsonToHtmlElementTags,\n  RTEJsonToHtmlOptions,\n  RTEJsonToHtmlTextTags,\n  RTESerializerAnyObject,\n} from \"./serializer-types.js\"\n","import {\n  type IJsonToHtmlElementTags,\n  type IJsonToHtmlOptions,\n  jsonToHtml,\n} from \"@contentstack/json-rte-serializer\"\nimport { normalizeForSerializer } from \"./serializer.js\"\nimport type { RTEDocNode, RTENode } from \"./types.js\"\nimport { isRecord } from \"./utils.js\"\n\nexport interface ToHTMLOptions {\n  renderEntry?: (attrs: Record<string, unknown>, node: RTENode) => string\n  renderAsset?: (attrs: Record<string, unknown>, node: RTENode) => string\n  serializerOptions?: IJsonToHtmlOptions\n}\n\nexport function toHTML(doc: RTEDocNode, options: ToHTMLOptions = {}): string {\n  return jsonToHtml(\n    normalizeForSerializer(doc) as unknown as Record<string, unknown>,\n    buildSerializerOptions(options),\n  )\n}\n\nfunction buildSerializerOptions(options: ToHTMLOptions): IJsonToHtmlOptions | undefined {\n  const { renderEntry, renderAsset, serializerOptions } = options\n\n  if (!renderEntry && !renderAsset) {\n    return serializerOptions\n  }\n\n  const customElementTypes: IJsonToHtmlElementTags = {\n    ...(serializerOptions?.customElementTypes ?? {}),\n  }\n\n  const existingReferenceRenderer = customElementTypes.reference\n\n  customElementTypes.reference = (attrs, child, jsonBlock, extraProps) => {\n    const block = asRTENode(jsonBlock)\n    const referenceAttrs = isRecord(block.attrs) ? block.attrs : {}\n\n    if (referenceAttrs.type === \"entry\" && renderEntry) {\n      return renderEntry(referenceAttrs, block)\n    }\n\n    if (referenceAttrs.type === \"asset\" && renderAsset) {\n      return renderAsset(referenceAttrs, block)\n    }\n\n    return typeof existingReferenceRenderer === \"function\"\n      ? existingReferenceRenderer(attrs, child, jsonBlock, extraProps)\n      : \"\"\n  }\n\n  return {\n    ...serializerOptions,\n    customElementTypes,\n  }\n}\n\nfunction asRTENode(value: unknown): RTENode {\n  if (isRecord(value) && typeof value.type === \"string\" && typeof value.uid === \"string\") {\n    return value as unknown as RTENode\n  }\n\n  return {\n    type: \"reference\",\n    uid: \"reference\",\n  }\n}\n","import type { RTENode, RTETextNode } from \"./types.js\"\n\nexport const KNOWN_RTE_TYPES = new Set([\n  \"doc\",\n  \"p\",\n  \"h1\",\n  \"h2\",\n  \"h3\",\n  \"h4\",\n  \"h5\",\n  \"h6\",\n  \"ul\",\n  \"ol\",\n  \"li\",\n  \"blockquote\",\n  \"code\",\n  \"img\",\n  \"a\",\n  \"table\",\n  \"tr\",\n  \"td\",\n  \"th\",\n  \"hr\",\n  \"reference\",\n])\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null\n}\n\nexport function isTextNode(value: unknown): value is RTETextNode {\n  return isRecord(value) && typeof value.text === \"string\" && typeof value.type !== \"string\"\n}\n\nexport function isElementNode(value: unknown): value is RTENode {\n  return isRecord(value) && typeof value.type === \"string\" && typeof value.uid === \"string\"\n}\n\nexport function escapeHTML(value: string): string {\n  return value\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\\\"/g, \"&quot;\")\n    .replace(/'/g, \"&#39;\")\n}\n\nexport function decodeHTML(value: string): string {\n  return value\n    .replace(/&nbsp;/g, \" \")\n    .replace(/&quot;/g, '\"')\n    .replace(/&#39;/g, \"'\")\n    .replace(/&lt;/g, \"<\")\n    .replace(/&gt;/g, \">\")\n    .replace(/&amp;/g, \"&\")\n}\n\nexport function createUid(): string {\n  const uuid = globalThis.crypto?.randomUUID\n  if (typeof uuid === \"function\") {\n    return uuid.call(globalThis.crypto)\n  }\n\n  return `rte-${Math.random().toString(36).slice(2, 10)}`\n}\n","import type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { isRecord, isTextNode } from \"./utils.js\"\n\nconst DEFAULT_TABLE_COLUMN_WIDTH = 250\n\nexport function normalizeForSerializer(doc: RTEDocNode): RTEDocNode {\n  const normalized = normalizeNode(doc)\n\n  if (!isTextNode(normalized) && normalized.type === \"doc\") {\n    return normalized as RTEDocNode\n  }\n\n  return {\n    ...doc,\n    children: [],\n  }\n}\n\nfunction normalizeNode(node: RTENode | RTETextNode): RTENode | RTETextNode {\n  if (isTextNode(node)) {\n    return { ...node }\n  }\n\n  const children = node.children?.map((child) => normalizeNode(child))\n  const attrs = isRecord(node.attrs) ? { ...node.attrs } : {}\n\n  if (node.type === \"a\" && typeof attrs.url !== \"string\" && typeof attrs.href === \"string\") {\n    attrs.url = attrs.href\n  }\n\n  if (node.type === \"img\" && typeof attrs.url !== \"string\" && typeof attrs.src === \"string\") {\n    attrs.url = attrs.src\n  }\n\n  if (node.type === \"table\") {\n    const tableRows = (children ?? []).filter(\n      (row): row is RTENode => !isTextNode(row) && row.type === \"tr\",\n    )\n\n    const inferredCols = tableRows.reduce((max, row) => {\n      const columnCount = (row.children ?? []).filter(\n        (cell) => !isTextNode(cell) && (cell.type === \"td\" || cell.type === \"th\"),\n      ).length\n      return Math.max(max, columnCount)\n    }, 0)\n\n    const normalizedCols =\n      typeof attrs.cols === \"number\" && attrs.cols > 0 ? attrs.cols : inferredCols\n    const normalizedRows =\n      typeof attrs.rows === \"number\" && attrs.rows > 0 ? attrs.rows : tableRows.length\n    const normalizedWidths =\n      Array.isArray(attrs.colWidths) &&\n      attrs.colWidths.length > 0 &&\n      attrs.colWidths.every((width) => typeof width === \"number\")\n        ? attrs.colWidths\n        : Array.from({ length: Math.max(normalizedCols, 1) }, () => DEFAULT_TABLE_COLUMN_WIDTH)\n\n    return {\n      ...node,\n      attrs: {\n        ...attrs,\n        rows: normalizedRows,\n        cols: Math.max(normalizedCols, 1),\n        colWidths: normalizedWidths,\n      },\n      ...(children ? { children } : {}),\n    }\n  }\n\n  return {\n    ...node,\n    attrs,\n    ...(children ? { children } : {}),\n  }\n}\n","import { jsonToMarkdown } from \"@contentstack/json-rte-serializer\"\nimport { normalizeForSerializer } from \"./serializer.js\"\nimport type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { isTextNode } from \"./utils.js\"\n\nexport interface ToMarkdownOptions {\n  renderEntry?: (attrs: Record<string, unknown>, node: RTENode) => string\n  renderAsset?: (attrs: Record<string, unknown>, node: RTENode) => string\n}\n\nexport function toMarkdown(doc: RTEDocNode, options: ToMarkdownOptions = {}): string {\n  const mappedDoc =\n    options.renderEntry || options.renderAsset ? mapReferenceNodes(doc, options) : doc\n  const markdown = jsonToMarkdown(normalizeForSerializer(mappedDoc)).trim()\n  return normalizeMarkdownOutput(markdown)\n}\n\nfunction mapReferenceNodes(doc: RTEDocNode, options: ToMarkdownOptions): RTEDocNode {\n  const mapped = mapNode(doc, options)\n  if (isTextNode(mapped)) {\n    return {\n      ...doc,\n      children: [],\n    }\n  }\n\n  return {\n    ...doc,\n    ...mapped,\n    type: \"doc\",\n    uid: mapped.uid ?? doc.uid,\n  }\n}\n\nfunction mapNode(node: RTENode | RTETextNode, options: ToMarkdownOptions): RTENode | RTETextNode {\n  if (isTextNode(node)) {\n    return { ...node }\n  }\n\n  if (node.type === \"reference\") {\n    const attrs = node.attrs ?? {}\n    if (attrs.type === \"entry\" && options.renderEntry) {\n      return { text: options.renderEntry(attrs, node) }\n    }\n    if (attrs.type === \"asset\" && options.renderAsset) {\n      return { text: options.renderAsset(attrs, node) }\n    }\n    return { text: \"\" }\n  }\n\n  return {\n    ...node,\n    ...(node.children ? { children: node.children.map((child) => mapNode(child, options)) } : {}),\n  }\n}\n\nfunction normalizeMarkdownOutput(markdown: string): string {\n  return markdown.replace(/!\\[([^\\]]*)\\]\\s*\\n\\s*\\(([^)\\n]+)\\)/g, \"![$1]($2)\")\n}\n","import type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { isTextNode } from \"./utils.js\"\n\nconst DOUBLE_BREAK_TYPES = new Set([\n  \"p\",\n  \"h1\",\n  \"h2\",\n  \"h3\",\n  \"h4\",\n  \"h5\",\n  \"h6\",\n  \"blockquote\",\n  \"code\",\n  \"ul\",\n  \"ol\",\n  \"table\",\n])\n\nconst SINGLE_BREAK_TYPES = new Set([\"li\", \"tr\", \"td\", \"th\"])\n\nexport function toPlainText(doc: RTEDocNode): string {\n  return renderNode(doc)\n    .replace(/\\n{3,}/g, \"\\n\\n\")\n    .trim()\n}\n\nfunction renderNode(node: RTENode | RTETextNode): string {\n  if (isTextNode(node)) {\n    return node.text\n  }\n\n  const children = (node.children ?? []).map((child) => renderNode(child)).join(\"\")\n\n  if (node.type === \"doc\") {\n    return children\n  }\n\n  if (node.type === \"img\") {\n    const alt = node.attrs?.alt\n    if (typeof alt === \"string\" && alt.trim()) {\n      return `${alt}\\n\\n`\n    }\n    return \"\\n\"\n  }\n\n  if (node.type === \"a\") {\n    const href = node.attrs?.href\n    const text = children || (typeof href === \"string\" ? href : \"\")\n    return text\n  }\n\n  if (node.type === \"hr\") {\n    return \"\\n\"\n  }\n\n  if (node.type === \"reference\") {\n    return \"\"\n  }\n\n  if (DOUBLE_BREAK_TYPES.has(node.type)) {\n    return `${children}\\n\\n`\n  }\n\n  if (SINGLE_BREAK_TYPES.has(node.type)) {\n    return `${children}\\n`\n  }\n\n  return children\n}\n","import { type IHtmlToJsonOptions, htmlToJson } from \"@contentstack/json-rte-serializer\"\nimport type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { createUid, decodeHTML, isRecord } from \"./utils.js\"\n\ninterface ParsedElement {\n  kind: \"element\"\n  tag: string\n  attrs: Record<string, string>\n  children: ParsedNode[]\n}\n\ninterface ParsedText {\n  kind: \"text\"\n  value: string\n}\n\ntype ParsedNode = ParsedElement | ParsedText\n\ntype TextMarks = Pick<\n  RTETextNode,\n  \"bold\" | \"italic\" | \"underline\" | \"strikethrough\" | \"code\" | \"superscript\" | \"subscript\"\n>\n\nconst VOID_TAGS = new Set([\"img\", \"hr\", \"br\", \"meta\", \"link\", \"input\"])\n\nexport interface FromHTMLOptions {\n  serializerOptions?: IHtmlToJsonOptions\n}\n\nexport function fromHTML(html: string, options: FromHTMLOptions = {}): RTEDocNode {\n  const parsed = parseWithSerializer(html, options)\n  if (parsed) {\n    return parsed\n  }\n\n  return parseWithFallback(html)\n}\n\nfunction parseWithSerializer(html: string, options: FromHTMLOptions): RTEDocNode | null {\n  try {\n    const parsed = htmlToJson(html, options.serializerOptions)\n    return normalizeDoc(parsed)\n  } catch {\n    return null\n  }\n}\n\nfunction normalizeDoc(value: unknown): RTEDocNode | null {\n  if (isRecord(value) && value.type === \"doc\" && Array.isArray(value.children)) {\n    return {\n      ...value,\n      type: \"doc\",\n      uid: typeof value.uid === \"string\" && value.uid.length > 0 ? value.uid : createUid(),\n      children: value.children as Array<RTENode | RTETextNode>,\n    } as RTEDocNode\n  }\n\n  return null\n}\n\nfunction parseWithFallback(html: string): RTEDocNode {\n  const root = parseHTML(html)\n  const children = convertNodes(root.children)\n\n  return {\n    type: \"doc\",\n    uid: createUid(),\n    children,\n  }\n}\n\nfunction parseHTML(html: string): ParsedElement {\n  const root: ParsedElement = {\n    kind: \"element\",\n    tag: \"root\",\n    attrs: {},\n    children: [],\n  }\n\n  const stack: ParsedElement[] = [root]\n  const tokenPattern = /<!--[\\s\\S]*?-->|<\\/?[^>]+>|[^<]+/g\n  const tokens = html.match(tokenPattern) ?? []\n\n  for (const token of tokens) {\n    if (!token) {\n      continue\n    }\n\n    if (token.startsWith(\"<!--\")) {\n      continue\n    }\n\n    if (!token.startsWith(\"<\")) {\n      const text = decodeHTML(token)\n      if (text.length === 0) {\n        continue\n      }\n\n      const parent = stack[stack.length - 1]\n      if (!parent) {\n        continue\n      }\n\n      parent.children.push({\n        kind: \"text\",\n        value: text,\n      })\n      continue\n    }\n\n    if (token.startsWith(\"</\")) {\n      const closingTag = token.slice(2, -1).trim().toLowerCase()\n      while (stack.length > 1) {\n        const current = stack.pop()\n        if (current?.tag === closingTag) {\n          break\n        }\n      }\n      continue\n    }\n\n    const parsed = parseOpeningTag(token)\n    if (!parsed) {\n      continue\n    }\n\n    const parent = stack[stack.length - 1]\n    if (!parent) {\n      continue\n    }\n\n    parent.children.push(parsed.element)\n\n    const isVoid = parsed.selfClosing || VOID_TAGS.has(parsed.element.tag)\n    if (!isVoid) {\n      stack.push(parsed.element)\n    }\n  }\n\n  return root\n}\n\nfunction parseOpeningTag(token: string): { element: ParsedElement; selfClosing: boolean } | null {\n  const isSelfClosing = token.endsWith(\"/>\")\n  const content = token.slice(1, token.length - (isSelfClosing ? 2 : 1)).trim()\n\n  if (!content) {\n    return null\n  }\n\n  const tagMatch = content.match(/^([a-zA-Z0-9-]+)/)\n  if (!tagMatch?.[1]) {\n    return null\n  }\n\n  const tag = tagMatch[1].toLowerCase()\n  const attrs = parseAttributes(content.slice(tag.length).trim())\n\n  return {\n    element: {\n      kind: \"element\",\n      tag,\n      attrs,\n      children: [],\n    },\n    selfClosing: isSelfClosing,\n  }\n}\n\nfunction parseAttributes(input: string): Record<string, string> {\n  const attrs: Record<string, string> = {}\n  const attrPattern = /([:@a-zA-Z0-9_-]+)(?:\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|([^\\s\"'>/]+)))?/g\n\n  let match = attrPattern.exec(input)\n  while (match) {\n    const key = match[1]\n    if (key) {\n      const value = decodeHTML(match[3] ?? match[4] ?? match[5] ?? \"\")\n      attrs[key] = value\n    }\n    match = attrPattern.exec(input)\n  }\n\n  return attrs\n}\n\nfunction convertNodes(nodes: ParsedNode[], marks: TextMarks = {}): Array<RTENode | RTETextNode> {\n  const output: Array<RTENode | RTETextNode> = []\n\n  for (const node of nodes) {\n    if (node.kind === \"text\") {\n      const cleaned = normalizeText(node.value)\n      if (!cleaned) {\n        continue\n      }\n\n      output.push({\n        text: cleaned,\n        ...(marks.bold ? { bold: true } : {}),\n        ...(marks.italic ? { italic: true } : {}),\n        ...(marks.underline ? { underline: true } : {}),\n        ...(marks.strikethrough ? { strikethrough: true } : {}),\n        ...(marks.code ? { code: true } : {}),\n        ...(marks.superscript ? { superscript: true } : {}),\n        ...(marks.subscript ? { subscript: true } : {}),\n      })\n      continue\n    }\n\n    output.push(...convertElement(node, marks))\n  }\n\n  return output\n}\n\nfunction convertElement(element: ParsedElement, marks: TextMarks): Array<RTENode | RTETextNode> {\n  switch (element.tag) {\n    case \"strong\":\n    case \"b\":\n      return convertNodes(element.children, { ...marks, bold: true })\n    case \"em\":\n    case \"i\":\n      return convertNodes(element.children, { ...marks, italic: true })\n    case \"u\":\n      return convertNodes(element.children, { ...marks, underline: true })\n    case \"s\":\n    case \"strike\":\n    case \"del\":\n      return convertNodes(element.children, { ...marks, strikethrough: true })\n    case \"sup\":\n      return convertNodes(element.children, { ...marks, superscript: true })\n    case \"sub\":\n      return convertNodes(element.children, { ...marks, subscript: true })\n    case \"code\":\n      return convertNodes(element.children, { ...marks, code: true })\n    case \"br\":\n      return [{ text: \"\\n\" }]\n    case \"img\":\n      return [\n        {\n          type: \"img\",\n          uid: createUid(),\n          attrs: {\n            src: element.attrs.src ?? \"\",\n            alt: element.attrs.alt ?? \"\",\n          },\n        },\n      ]\n    case \"hr\":\n      return [\n        {\n          type: \"hr\",\n          uid: createUid(),\n        },\n      ]\n    case \"a\":\n      return [\n        {\n          type: \"a\",\n          uid: createUid(),\n          attrs: {\n            href: element.attrs.href ?? \"\",\n            ...(element.attrs.target ? { target: element.attrs.target } : {}),\n          },\n          children: convertNodes(element.children),\n        },\n      ]\n    case \"reference\":\n      return [\n        {\n          type: \"reference\",\n          uid: createUid(),\n          attrs: {\n            ...element.attrs,\n          },\n        },\n      ]\n    case \"pre\": {\n      const codeText = extractTextContent(element)\n      return [\n        {\n          type: \"code\",\n          uid: createUid(),\n          children: codeText ? [{ text: codeText }] : [],\n        },\n      ]\n    }\n    case \"p\":\n    case \"h1\":\n    case \"h2\":\n    case \"h3\":\n    case \"h4\":\n    case \"h5\":\n    case \"h6\":\n    case \"ul\":\n    case \"ol\":\n    case \"li\":\n    case \"blockquote\":\n    case \"table\":\n    case \"tr\":\n    case \"td\":\n    case \"th\":\n      return [\n        {\n          type: element.tag,\n          uid: createUid(),\n          children: convertNodes(element.children),\n        },\n      ]\n    default:\n      return convertNodes(element.children, marks)\n  }\n}\n\nfunction extractTextContent(node: ParsedNode): string {\n  if (node.kind === \"text\") {\n    return decodeHTML(node.value)\n  }\n\n  return node.children.map((child) => extractTextContent(child)).join(\"\")\n}\n\nfunction normalizeText(value: string): string {\n  const collapsed = value.replace(/\\s+/g, \" \")\n  if (collapsed.trim().length === 0) {\n    return \" \"\n  }\n  return collapsed\n}\n","import type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { isTextNode } from \"./utils.js\"\n\nexport function transform(\n  doc: RTEDocNode,\n  visitors: Record<string, (node: RTENode) => RTENode | undefined>,\n): RTEDocNode {\n  const transformed = visitNode(doc, visitors)\n\n  if (!transformed || isTextNode(transformed) || transformed.type !== \"doc\") {\n    return {\n      ...doc,\n      children: [],\n    }\n  }\n\n  return transformed as RTEDocNode\n}\n\nfunction visitNode(\n  node: RTENode | RTETextNode,\n  visitors: Record<string, (node: RTENode) => RTENode | undefined>,\n): RTENode | RTETextNode | undefined {\n  if (isTextNode(node)) {\n    return { ...node }\n  }\n\n  const nextChildren = (node.children ?? [])\n    .map((child) => visitNode(child, visitors))\n    .filter((child): child is RTENode | RTETextNode => Boolean(child))\n\n  const withChildren: RTENode = {\n    ...node,\n    ...(node.children ? { children: nextChildren } : {}),\n  }\n\n  const visitor = visitors[withChildren.type]\n  if (!visitor) {\n    return withChildren\n  }\n\n  return visitor(withChildren)\n}\n","import type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { KNOWN_RTE_TYPES, isElementNode, isRecord, isTextNode } from \"./utils.js\"\n\nexport function validate(doc: unknown): { valid: boolean; errors: string[] } {\n  const errors: string[] = []\n\n  if (!isElementNode(doc)) {\n    errors.push(\"Document must be an object node with type and uid\")\n    return { valid: false, errors }\n  }\n\n  if (doc.type !== \"doc\") {\n    errors.push('Document root node must have type \"doc\"')\n  }\n\n  if (!Array.isArray(doc.children)) {\n    errors.push('Document root node must include a \"children\" array')\n  } else {\n    validateChildren(doc.children, \"doc.children\", errors)\n  }\n\n  return { valid: errors.length === 0, errors }\n}\n\nfunction validateChildren(\n  children: unknown[],\n  path: string,\n  errors: string[],\n): asserts children is Array<RTENode | RTETextNode> {\n  children.forEach((child, index) => {\n    validateNode(child, `${path}[${index}]`, errors)\n  })\n}\n\nfunction validateNode(node: unknown, path: string, errors: string[]): void {\n  if (isTextNode(node)) {\n    if (typeof node.text !== \"string\") {\n      errors.push(`${path} must have a string text value`)\n    }\n    return\n  }\n\n  if (!isElementNode(node)) {\n    errors.push(`${path} must be a valid element node or text node`)\n    return\n  }\n\n  validateElementNode(node, path, errors)\n}\n\nfunction validateElementNode(node: RTENode, path: string, errors: string[]): void {\n  if (!KNOWN_RTE_TYPES.has(node.type)) {\n    errors.push(`${path}.type \"${node.type}\" is not a supported RTE node type`)\n  }\n\n  if (typeof node.uid !== \"string\" || node.uid.trim().length === 0) {\n    errors.push(`${path}.uid must be a non-empty string`)\n  }\n\n  if (node.children !== undefined) {\n    if (!Array.isArray(node.children)) {\n      errors.push(`${path}.children must be an array when provided`)\n    } else {\n      validateChildren(node.children, `${path}.children`, errors)\n    }\n  }\n\n  switch (node.type) {\n    case \"img\":\n      validateImgNode(node, path, errors)\n      break\n    case \"a\":\n      validateAnchorNode(node, path, errors)\n      break\n    case \"reference\":\n      validateReferenceNode(node, path, errors)\n      break\n    case \"hr\":\n      if (Array.isArray(node.children) && node.children.length > 0) {\n        errors.push(`${path}.children must be empty for hr nodes`)\n      }\n      break\n  }\n}\n\nfunction validateImgNode(node: RTENode, path: string, errors: string[]): void {\n  if (!isRecord(node.attrs) || typeof node.attrs.src !== \"string\" || node.attrs.src.length === 0) {\n    errors.push(`${path}.attrs.src must be a non-empty string for img nodes`)\n  }\n\n  if (isRecord(node.attrs) && node.attrs.alt !== undefined && typeof node.attrs.alt !== \"string\") {\n    errors.push(`${path}.attrs.alt must be a string when provided`)\n  }\n}\n\nfunction validateAnchorNode(node: RTENode, path: string, errors: string[]): void {\n  if (\n    !isRecord(node.attrs) ||\n    typeof node.attrs.href !== \"string\" ||\n    node.attrs.href.length === 0\n  ) {\n    errors.push(`${path}.attrs.href must be a non-empty string for a nodes`)\n  }\n\n  if (\n    isRecord(node.attrs) &&\n    node.attrs.target !== undefined &&\n    typeof node.attrs.target !== \"string\"\n  ) {\n    errors.push(`${path}.attrs.target must be a string when provided`)\n  }\n}\n\nfunction validateReferenceNode(node: RTENode, path: string, errors: string[]): void {\n  if (!isRecord(node.attrs)) {\n    errors.push(`${path}.attrs must be present for reference nodes`)\n    return\n  }\n\n  const refType = node.attrs.type\n  if (refType !== \"entry\" && refType !== \"asset\") {\n    errors.push(`${path}.attrs.type must be \"entry\" or \"asset\" for reference nodes`)\n    return\n  }\n\n  if (refType === \"entry\" && typeof node.attrs[\"entry-uid\"] !== \"string\") {\n    errors.push(`${path}.attrs[\"entry-uid\"] must be provided for entry references`)\n  }\n\n  if (refType === \"asset\" && typeof node.attrs[\"asset-uid\"] !== \"string\") {\n    errors.push(`${path}.attrs[\"asset-uid\"] must be provided for asset references`)\n  }\n}\n\nexport type { RTEDocNode }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,iCAIO;;;ACFA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,SAAS,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEO,SAAS,WAAW,OAAsC;AAC/D,SAAO,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,SAAS;AACpF;AAEO,SAAS,cAAc,OAAkC;AAC9D,SAAO,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,QAAQ;AACnF;AAWO,SAAS,WAAW,OAAuB;AAChD,SAAO,MACJ,QAAQ,WAAW,GAAG,EACtB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG;AAC1B;AAEO,SAAS,YAAoB;AAClC,QAAM,OAAO,WAAW,QAAQ;AAChC,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO,KAAK,KAAK,WAAW,MAAM;AAAA,EACpC;AAEA,SAAO,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACvD;;;AC7DA,IAAM,6BAA6B;AAE5B,SAAS,uBAAuB,KAA6B;AAClE,QAAM,aAAa,cAAc,GAAG;AAEpC,MAAI,CAAC,WAAW,UAAU,KAAK,WAAW,SAAS,OAAO;AACxD,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,CAAC;AAAA,EACb;AACF;AAEA,SAAS,cAAc,MAAoD;AACzE,MAAI,WAAW,IAAI,GAAG;AACpB,WAAO,EAAE,GAAG,KAAK;AAAA,EACnB;AAEA,QAAM,WAAW,KAAK,UAAU,IAAI,CAAC,UAAU,cAAc,KAAK,CAAC;AACnE,QAAM,QAAQ,SAAS,KAAK,KAAK,IAAI,EAAE,GAAG,KAAK,MAAM,IAAI,CAAC;AAE1D,MAAI,KAAK,SAAS,OAAO,OAAO,MAAM,QAAQ,YAAY,OAAO,MAAM,SAAS,UAAU;AACxF,UAAM,MAAM,MAAM;AAAA,EACpB;AAEA,MAAI,KAAK,SAAS,SAAS,OAAO,MAAM,QAAQ,YAAY,OAAO,MAAM,QAAQ,UAAU;AACzF,UAAM,MAAM,MAAM;AAAA,EACpB;AAEA,MAAI,KAAK,SAAS,SAAS;AACzB,UAAM,aAAa,YAAY,CAAC,GAAG;AAAA,MACjC,CAAC,QAAwB,CAAC,WAAW,GAAG,KAAK,IAAI,SAAS;AAAA,IAC5D;AAEA,UAAM,eAAe,UAAU,OAAO,CAAC,KAAK,QAAQ;AAClD,YAAM,eAAe,IAAI,YAAY,CAAC,GAAG;AAAA,QACvC,CAAC,SAAS,CAAC,WAAW,IAAI,MAAM,KAAK,SAAS,QAAQ,KAAK,SAAS;AAAA,MACtE,EAAE;AACF,aAAO,KAAK,IAAI,KAAK,WAAW;AAAA,IAClC,GAAG,CAAC;AAEJ,UAAM,iBACJ,OAAO,MAAM,SAAS,YAAY,MAAM,OAAO,IAAI,MAAM,OAAO;AAClE,UAAM,iBACJ,OAAO,MAAM,SAAS,YAAY,MAAM,OAAO,IAAI,MAAM,OAAO,UAAU;AAC5E,UAAM,mBACJ,MAAM,QAAQ,MAAM,SAAS,KAC7B,MAAM,UAAU,SAAS,KACzB,MAAM,UAAU,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,IACtD,MAAM,YACN,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,gBAAgB,CAAC,EAAE,GAAG,MAAM,0BAA0B;AAE1F,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM;AAAA,QACN,MAAM,KAAK,IAAI,gBAAgB,CAAC;AAAA,QAChC,WAAW;AAAA,MACb;AAAA,MACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,EACjC;AACF;;;AF3DO,SAAS,OAAO,KAAiB,UAAyB,CAAC,GAAW;AAC3E,aAAO;AAAA,IACL,uBAAuB,GAAG;AAAA,IAC1B,uBAAuB,OAAO;AAAA,EAChC;AACF;AAEA,SAAS,uBAAuB,SAAwD;AACtF,QAAM,EAAE,aAAa,aAAa,kBAAkB,IAAI;AAExD,MAAI,CAAC,eAAe,CAAC,aAAa;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,qBAA6C;AAAA,IACjD,GAAI,mBAAmB,sBAAsB,CAAC;AAAA,EAChD;AAEA,QAAM,4BAA4B,mBAAmB;AAErD,qBAAmB,YAAY,CAAC,OAAO,OAAO,WAAW,eAAe;AACtE,UAAM,QAAQ,UAAU,SAAS;AACjC,UAAM,iBAAiB,SAAS,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE9D,QAAI,eAAe,SAAS,WAAW,aAAa;AAClD,aAAO,YAAY,gBAAgB,KAAK;AAAA,IAC1C;AAEA,QAAI,eAAe,SAAS,WAAW,aAAa;AAClD,aAAO,YAAY,gBAAgB,KAAK;AAAA,IAC1C;AAEA,WAAO,OAAO,8BAA8B,aACxC,0BAA0B,OAAO,OAAO,WAAW,UAAU,IAC7D;AAAA,EACN;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,UAAU,OAAyB;AAC1C,MAAI,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,QAAQ,UAAU;AACtF,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,EACP;AACF;;;AGnEA,IAAAA,8BAA+B;AAUxB,SAAS,WAAW,KAAiB,UAA6B,CAAC,GAAW;AACnF,QAAM,YACJ,QAAQ,eAAe,QAAQ,cAAc,kBAAkB,KAAK,OAAO,IAAI;AACjF,QAAM,eAAW,4CAAe,uBAAuB,SAAS,CAAC,EAAE,KAAK;AACxE,SAAO,wBAAwB,QAAQ;AACzC;AAEA,SAAS,kBAAkB,KAAiB,SAAwC;AAClF,QAAM,SAAS,QAAQ,KAAK,OAAO;AACnC,MAAI,WAAW,MAAM,GAAG;AACtB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,MAAM;AAAA,IACN,KAAK,OAAO,OAAO,IAAI;AAAA,EACzB;AACF;AAEA,SAAS,QAAQ,MAA6B,SAAmD;AAC/F,MAAI,WAAW,IAAI,GAAG;AACpB,WAAO,EAAE,GAAG,KAAK;AAAA,EACnB;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,UAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAI,MAAM,SAAS,WAAW,QAAQ,aAAa;AACjD,aAAO,EAAE,MAAM,QAAQ,YAAY,OAAO,IAAI,EAAE;AAAA,IAClD;AACA,QAAI,MAAM,SAAS,WAAW,QAAQ,aAAa;AACjD,aAAO,EAAE,MAAM,QAAQ,YAAY,OAAO,IAAI,EAAE;AAAA,IAClD;AACA,WAAO,EAAE,MAAM,GAAG;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU,QAAQ,OAAO,OAAO,CAAC,EAAE,IAAI,CAAC;AAAA,EAC7F;AACF;AAEA,SAAS,wBAAwB,UAA0B;AACzD,SAAO,SAAS,QAAQ,uCAAuC,WAAW;AAC5E;;;ACvDA,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,qBAAqB,oBAAI,IAAI,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC;AAEpD,SAAS,YAAY,KAAyB;AACnD,SAAO,WAAW,GAAG,EAClB,QAAQ,WAAW,MAAM,EACzB,KAAK;AACV;AAEA,SAAS,WAAW,MAAqC;AACvD,MAAI,WAAW,IAAI,GAAG;AACpB,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,YAAY,KAAK,YAAY,CAAC,GAAG,IAAI,CAAC,UAAU,WAAW,KAAK,CAAC,EAAE,KAAK,EAAE;AAEhF,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,OAAO;AACvB,UAAM,MAAM,KAAK,OAAO;AACxB,QAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,GAAG;AACzC,aAAO,GAAG,GAAG;AAAA;AAAA;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,KAAK;AACrB,UAAM,OAAO,KAAK,OAAO;AACzB,UAAM,OAAO,aAAa,OAAO,SAAS,WAAW,OAAO;AAC5D,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,MAAM;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,IAAI,KAAK,IAAI,GAAG;AACrC,WAAO,GAAG,QAAQ;AAAA;AAAA;AAAA,EACpB;AAEA,MAAI,mBAAmB,IAAI,KAAK,IAAI,GAAG;AACrC,WAAO,GAAG,QAAQ;AAAA;AAAA,EACpB;AAEA,SAAO;AACT;;;ACpEA,IAAAC,8BAAoD;AAuBpD,IAAM,YAAY,oBAAI,IAAI,CAAC,OAAO,MAAM,MAAM,QAAQ,QAAQ,OAAO,CAAC;AAM/D,SAAS,SAAS,MAAc,UAA2B,CAAC,GAAe;AAChF,QAAM,SAAS,oBAAoB,MAAM,OAAO;AAChD,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,SAAO,kBAAkB,IAAI;AAC/B;AAEA,SAAS,oBAAoB,MAAc,SAA6C;AACtF,MAAI;AACF,UAAM,aAAS,wCAAW,MAAM,QAAQ,iBAAiB;AACzD,WAAO,aAAa,MAAM;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,OAAmC;AACvD,MAAI,SAAS,KAAK,KAAK,MAAM,SAAS,SAAS,MAAM,QAAQ,MAAM,QAAQ,GAAG;AAC5E,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,MACN,KAAK,OAAO,MAAM,QAAQ,YAAY,MAAM,IAAI,SAAS,IAAI,MAAM,MAAM,UAAU;AAAA,MACnF,UAAU,MAAM;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAA0B;AACnD,QAAM,OAAO,UAAU,IAAI;AAC3B,QAAM,WAAW,aAAa,KAAK,QAAQ;AAE3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,UAAU;AAAA,IACf;AAAA,EACF;AACF;AAEA,SAAS,UAAU,MAA6B;AAC9C,QAAM,OAAsB;AAAA,IAC1B,MAAM;AAAA,IACN,KAAK;AAAA,IACL,OAAO,CAAC;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAEA,QAAM,QAAyB,CAAC,IAAI;AACpC,QAAM,eAAe;AACrB,QAAM,SAAS,KAAK,MAAM,YAAY,KAAK,CAAC;AAE5C,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,MAAM,GAAG;AAC5B;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,WAAW,GAAG,GAAG;AAC1B,YAAM,OAAO,WAAW,KAAK;AAC7B,UAAI,KAAK,WAAW,GAAG;AACrB;AAAA,MACF;AAEA,YAAMC,UAAS,MAAM,MAAM,SAAS,CAAC;AACrC,UAAI,CAACA,SAAQ;AACX;AAAA,MACF;AAEA,MAAAA,QAAO,SAAS,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,IAAI,GAAG;AAC1B,YAAM,aAAa,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY;AACzD,aAAO,MAAM,SAAS,GAAG;AACvB,cAAM,UAAU,MAAM,IAAI;AAC1B,YAAI,SAAS,QAAQ,YAAY;AAC/B;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,SAAS,gBAAgB,KAAK;AACpC,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,MAAM,SAAS,CAAC;AACrC,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,WAAO,SAAS,KAAK,OAAO,OAAO;AAEnC,UAAM,SAAS,OAAO,eAAe,UAAU,IAAI,OAAO,QAAQ,GAAG;AACrE,QAAI,CAAC,QAAQ;AACX,YAAM,KAAK,OAAO,OAAO;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAwE;AAC/F,QAAM,gBAAgB,MAAM,SAAS,IAAI;AACzC,QAAM,UAAU,MAAM,MAAM,GAAG,MAAM,UAAU,gBAAgB,IAAI,EAAE,EAAE,KAAK;AAE5E,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ,MAAM,kBAAkB;AACjD,MAAI,CAAC,WAAW,CAAC,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,SAAS,CAAC,EAAE,YAAY;AACpC,QAAM,QAAQ,gBAAgB,QAAQ,MAAM,IAAI,MAAM,EAAE,KAAK,CAAC;AAE9D,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,IACA,aAAa;AAAA,EACf;AACF;AAEA,SAAS,gBAAgB,OAAuC;AAC9D,QAAM,QAAgC,CAAC;AACvC,QAAM,cAAc;AAEpB,MAAI,QAAQ,YAAY,KAAK,KAAK;AAClC,SAAO,OAAO;AACZ,UAAM,MAAM,MAAM,CAAC;AACnB,QAAI,KAAK;AACP,YAAM,QAAQ,WAAW,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE;AAC/D,YAAM,GAAG,IAAI;AAAA,IACf;AACA,YAAQ,YAAY,KAAK,KAAK;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,OAAqB,QAAmB,CAAC,GAAiC;AAC9F,QAAM,SAAuC,CAAC;AAE9C,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,UAAU,cAAc,KAAK,KAAK;AACxC,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AAEA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,GAAI,MAAM,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAAA,QACnC,GAAI,MAAM,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACvC,GAAI,MAAM,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,QAC7C,GAAI,MAAM,gBAAgB,EAAE,eAAe,KAAK,IAAI,CAAC;AAAA,QACrD,GAAI,MAAM,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAAA,QACnC,GAAI,MAAM,cAAc,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,QACjD,GAAI,MAAM,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,MAC/C,CAAC;AACD;AAAA,IACF;AAEA,WAAO,KAAK,GAAG,eAAe,MAAM,KAAK,CAAC;AAAA,EAC5C;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,SAAwB,OAAgD;AAC9F,UAAQ,QAAQ,KAAK;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,aAAa,QAAQ,UAAU,EAAE,GAAG,OAAO,MAAM,KAAK,CAAC;AAAA,IAChE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,aAAa,QAAQ,UAAU,EAAE,GAAG,OAAO,QAAQ,KAAK,CAAC;AAAA,IAClE,KAAK;AACH,aAAO,aAAa,QAAQ,UAAU,EAAE,GAAG,OAAO,WAAW,KAAK,CAAC;AAAA,IACrE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,aAAa,QAAQ,UAAU,EAAE,GAAG,OAAO,eAAe,KAAK,CAAC;AAAA,IACzE,KAAK;AACH,aAAO,aAAa,QAAQ,UAAU,EAAE,GAAG,OAAO,aAAa,KAAK,CAAC;AAAA,IACvE,KAAK;AACH,aAAO,aAAa,QAAQ,UAAU,EAAE,GAAG,OAAO,WAAW,KAAK,CAAC;AAAA,IACrE,KAAK;AACH,aAAO,aAAa,QAAQ,UAAU,EAAE,GAAG,OAAO,MAAM,KAAK,CAAC;AAAA,IAChE,KAAK;AACH,aAAO,CAAC,EAAE,MAAM,KAAK,CAAC;AAAA,IACxB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,KAAK,UAAU;AAAA,UACf,OAAO;AAAA,YACL,KAAK,QAAQ,MAAM,OAAO;AAAA,YAC1B,KAAK,QAAQ,MAAM,OAAO;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,KAAK,UAAU;AAAA,QACjB;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,KAAK,UAAU;AAAA,UACf,OAAO;AAAA,YACL,MAAM,QAAQ,MAAM,QAAQ;AAAA,YAC5B,GAAI,QAAQ,MAAM,SAAS,EAAE,QAAQ,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,UACjE;AAAA,UACA,UAAU,aAAa,QAAQ,QAAQ;AAAA,QACzC;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,KAAK,UAAU;AAAA,UACf,OAAO;AAAA,YACL,GAAG,QAAQ;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF,KAAK,OAAO;AACV,YAAM,WAAW,mBAAmB,OAAO;AAC3C,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,KAAK,UAAU;AAAA,UACf,UAAU,WAAW,CAAC,EAAE,MAAM,SAAS,CAAC,IAAI,CAAC;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,MAAM,QAAQ;AAAA,UACd,KAAK,UAAU;AAAA,UACf,UAAU,aAAa,QAAQ,QAAQ;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACE,aAAO,aAAa,QAAQ,UAAU,KAAK;AAAA,EAC/C;AACF;AAEA,SAAS,mBAAmB,MAA0B;AACpD,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,WAAW,KAAK,KAAK;AAAA,EAC9B;AAEA,SAAO,KAAK,SAAS,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC,EAAE,KAAK,EAAE;AACxE;AAEA,SAAS,cAAc,OAAuB;AAC5C,QAAM,YAAY,MAAM,QAAQ,QAAQ,GAAG;AAC3C,MAAI,UAAU,KAAK,EAAE,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACrUO,SAAS,UACd,KACA,UACY;AACZ,QAAM,cAAc,UAAU,KAAK,QAAQ;AAE3C,MAAI,CAAC,eAAe,WAAW,WAAW,KAAK,YAAY,SAAS,OAAO;AACzE,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,UACP,MACA,UACmC;AACnC,MAAI,WAAW,IAAI,GAAG;AACpB,WAAO,EAAE,GAAG,KAAK;AAAA,EACnB;AAEA,QAAM,gBAAgB,KAAK,YAAY,CAAC,GACrC,IAAI,CAAC,UAAU,UAAU,OAAO,QAAQ,CAAC,EACzC,OAAO,CAAC,UAA0C,QAAQ,KAAK,CAAC;AAEnE,QAAM,eAAwB;AAAA,IAC5B,GAAG;AAAA,IACH,GAAI,KAAK,WAAW,EAAE,UAAU,aAAa,IAAI,CAAC;AAAA,EACpD;AAEA,QAAM,UAAU,SAAS,aAAa,IAAI;AAC1C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,YAAY;AAC7B;;;ACvCO,SAAS,SAAS,KAAoD;AAC3E,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,cAAc,GAAG,GAAG;AACvB,WAAO,KAAK,mDAAmD;AAC/D,WAAO,EAAE,OAAO,OAAO,OAAO;AAAA,EAChC;AAEA,MAAI,IAAI,SAAS,OAAO;AACtB,WAAO,KAAK,yCAAyC;AAAA,EACvD;AAEA,MAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,GAAG;AAChC,WAAO,KAAK,oDAAoD;AAAA,EAClE,OAAO;AACL,qBAAiB,IAAI,UAAU,gBAAgB,MAAM;AAAA,EACvD;AAEA,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAC9C;AAEA,SAAS,iBACP,UACA,MACA,QACkD;AAClD,WAAS,QAAQ,CAAC,OAAO,UAAU;AACjC,iBAAa,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK,MAAM;AAAA,EACjD,CAAC;AACH;AAEA,SAAS,aAAa,MAAe,MAAc,QAAwB;AACzE,MAAI,WAAW,IAAI,GAAG;AACpB,QAAI,OAAO,KAAK,SAAS,UAAU;AACjC,aAAO,KAAK,GAAG,IAAI,gCAAgC;AAAA,IACrD;AACA;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,IAAI,GAAG;AACxB,WAAO,KAAK,GAAG,IAAI,4CAA4C;AAC/D;AAAA,EACF;AAEA,sBAAoB,MAAM,MAAM,MAAM;AACxC;AAEA,SAAS,oBAAoB,MAAe,MAAc,QAAwB;AAChF,MAAI,CAAC,gBAAgB,IAAI,KAAK,IAAI,GAAG;AACnC,WAAO,KAAK,GAAG,IAAI,UAAU,KAAK,IAAI,oCAAoC;AAAA,EAC5E;AAEA,MAAI,OAAO,KAAK,QAAQ,YAAY,KAAK,IAAI,KAAK,EAAE,WAAW,GAAG;AAChE,WAAO,KAAK,GAAG,IAAI,iCAAiC;AAAA,EACtD;AAEA,MAAI,KAAK,aAAa,QAAW;AAC/B,QAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACjC,aAAO,KAAK,GAAG,IAAI,0CAA0C;AAAA,IAC/D,OAAO;AACL,uBAAiB,KAAK,UAAU,GAAG,IAAI,aAAa,MAAM;AAAA,IAC5D;AAAA,EACF;AAEA,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,sBAAgB,MAAM,MAAM,MAAM;AAClC;AAAA,IACF,KAAK;AACH,yBAAmB,MAAM,MAAM,MAAM;AACrC;AAAA,IACF,KAAK;AACH,4BAAsB,MAAM,MAAM,MAAM;AACxC;AAAA,IACF,KAAK;AACH,UAAI,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS,SAAS,GAAG;AAC5D,eAAO,KAAK,GAAG,IAAI,sCAAsC;AAAA,MAC3D;AACA;AAAA,EACJ;AACF;AAEA,SAAS,gBAAgB,MAAe,MAAc,QAAwB;AAC5E,MAAI,CAAC,SAAS,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,QAAQ,YAAY,KAAK,MAAM,IAAI,WAAW,GAAG;AAC9F,WAAO,KAAK,GAAG,IAAI,qDAAqD;AAAA,EAC1E;AAEA,MAAI,SAAS,KAAK,KAAK,KAAK,KAAK,MAAM,QAAQ,UAAa,OAAO,KAAK,MAAM,QAAQ,UAAU;AAC9F,WAAO,KAAK,GAAG,IAAI,2CAA2C;AAAA,EAChE;AACF;AAEA,SAAS,mBAAmB,MAAe,MAAc,QAAwB;AAC/E,MACE,CAAC,SAAS,KAAK,KAAK,KACpB,OAAO,KAAK,MAAM,SAAS,YAC3B,KAAK,MAAM,KAAK,WAAW,GAC3B;AACA,WAAO,KAAK,GAAG,IAAI,oDAAoD;AAAA,EACzE;AAEA,MACE,SAAS,KAAK,KAAK,KACnB,KAAK,MAAM,WAAW,UACtB,OAAO,KAAK,MAAM,WAAW,UAC7B;AACA,WAAO,KAAK,GAAG,IAAI,8CAA8C;AAAA,EACnE;AACF;AAEA,SAAS,sBAAsB,MAAe,MAAc,QAAwB;AAClF,MAAI,CAAC,SAAS,KAAK,KAAK,GAAG;AACzB,WAAO,KAAK,GAAG,IAAI,4CAA4C;AAC/D;AAAA,EACF;AAEA,QAAM,UAAU,KAAK,MAAM;AAC3B,MAAI,YAAY,WAAW,YAAY,SAAS;AAC9C,WAAO,KAAK,GAAG,IAAI,4DAA4D;AAC/E;AAAA,EACF;AAEA,MAAI,YAAY,WAAW,OAAO,KAAK,MAAM,WAAW,MAAM,UAAU;AACtE,WAAO,KAAK,GAAG,IAAI,2DAA2D;AAAA,EAChF;AAEA,MAAI,YAAY,WAAW,OAAO,KAAK,MAAM,WAAW,MAAM,UAAU;AACtE,WAAO,KAAK,GAAG,IAAI,2DAA2D;AAAA,EAChF;AACF;","names":["import_json_rte_serializer","import_json_rte_serializer","parent"]}