{"version":3,"sources":["../src/core/transformer.ts","../src/core/parser.ts"],"names":[],"mappings":"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","file":"chunk-GXV2TM5B.cjs","sourcesContent":["import type { TNode, Transformer } from './ast-types';\n\n/**\n * Runs a sequence of transformers against an AST root node.\n * Each transformer receives the children array from the previous step.\n *\n * Returns a new root node with the transformed children.\n *\n * @example\n * ```ts\n * const finalAst = applyTransformers(rawAst, [listGrouper, tableGrouper]);\n * ```\n */\nexport function applyTransformers(root: TNode, transformers: Transformer[]): TNode {\n  const children = transformers.reduce(\n    (currentChildren, transformer) => transformer(currentChildren),\n    root.children,\n  );\n  return { ...root, children };\n}\n\n/**\n * Composes multiple transformers into a single transformer function.\n *\n * @example\n * ```ts\n * const combined = composeTransformers(listGrouper, tableGrouper);\n * const finalChildren = combined(rawChildren);\n * ```\n */\nexport function composeTransformers(...transformers: Transformer[]): Transformer {\n  return (children: TNode[]) =>\n    transformers.reduce((currentChildren, transformer) => transformer(currentChildren), children);\n}\n","import type { Attributes, Delta, ParserConfig, TNode, Transformer } from './ast-types';\nimport { applyTransformers } from './transformer';\n\n// ─── Internal Accumulator ───────────────────────────────────────────────────\n\n/** Immutable parse state threaded through each op handler. */\ninterface ParseState {\n  /** Completed block-level nodes. */\n  blocks: TNode[];\n  /** Inline nodes waiting for a newline to flush into a block. */\n  buffer: TNode[];\n}\n\nconst EMPTY_STATE: ParseState = { blocks: [], buffer: [] };\n\n// ─── Pure Function API ──────────────────────────────────────────────────────\n\n/**\n * Parse a Quill Delta into a raw AST tree of TNode objects.\n *\n * This is the pure-function equivalent of `new DeltaParser(delta, config).toAST()`.\n * Block attribute recognition is driven by the `ParserConfig`, keeping\n * the parser free of Quill-specific knowledge.\n *\n * Returns a raw AST — apply transformers separately via {@link applyTransformers}\n * or use {@link parseQuillDelta} for a batteries-included pipeline.\n *\n * @example\n * ```ts\n * import { parseDelta, applyTransformers } from 'quill-delta-renderer/core';\n * import { listGrouper, tableGrouper } from 'quill-delta-renderer/common';\n *\n * const raw = parseDelta(delta, { blockAttributes: DEFAULT_BLOCK_ATTRIBUTES });\n * const ast = applyTransformers(raw, [listGrouper, tableGrouper]);\n * ```\n */\nexport function parseDelta(delta: Delta, config: ParserConfig): TNode {\n  if (!delta?.ops || !Array.isArray(delta.ops)) {\n    throw new TypeError(\n      'parseDelta: expected a Delta object with an ops array, received ' +\n        (delta === null ? 'null' : typeof delta),\n    );\n  }\n\n  const blockAttributes = config.blockAttributes;\n  const blockEmbeds = new Set(config.blockEmbeds ?? []);\n\n  let state: ParseState = EMPTY_STATE;\n\n  for (const op of delta.ops) {\n    if (op.insert === undefined) continue;\n\n    if (typeof op.insert === 'string') {\n      state = processTextOp(state, op.insert, op.attributes ?? {}, blockAttributes);\n    } else {\n      state = processEmbedOp(state, op.insert, op.attributes ?? {}, blockEmbeds);\n    }\n  }\n\n  // Flush any remaining inline content as a trailing paragraph\n  if (state.buffer.length > 0) {\n    state = {\n      blocks: [...state.blocks, createBlock('paragraph', {}, state.buffer)],\n      buffer: [],\n    };\n  }\n\n  return {\n    type: 'root',\n    attributes: {},\n    children: state.blocks,\n    isInline: false,\n  };\n}\n\n// ─── Class API (delegates to parseDelta) ────────────────────────────────────\n\n/**\n * Parses a Quill Delta into a tree of TNode objects.\n *\n * Provides a fluent builder API for registering transformers.\n * For a simpler functional approach, use {@link parseDelta} directly.\n *\n * @example\n * ```ts\n * const ast = new DeltaParser(delta, { blockAttributes: DEFAULT_BLOCK_ATTRIBUTES })\n *   .use(listGrouper)\n *   .use(tableGrouper)\n *   .toAST();\n * ```\n */\nexport class DeltaParser {\n  private readonly delta: Delta;\n  private readonly config: ParserConfig;\n  private readonly transformers: Transformer[] = [];\n\n  constructor(delta: Delta, config: ParserConfig) {\n    this.delta = delta;\n    this.config = config;\n  }\n\n  /**\n   * Register a transformer (middleware) to be applied after initial parsing.\n   * Transformers run in the order they are registered.\n   */\n  use(transformer: Transformer): this {\n    this.transformers.push(transformer);\n    return this;\n  }\n\n  /**\n   * Parse the delta into a raw AST, then apply all registered transformers.\n   */\n  toAST(): TNode {\n    return applyTransformers(parseDelta(this.delta, this.config), this.transformers);\n  }\n}\n\n// ─── Op Processors (pure — return new state) ────────────────────────────────\n\nfunction processTextOp(\n  state: ParseState,\n  text: string,\n  attrs: Attributes,\n  blockAttributes: ParserConfig['blockAttributes'],\n): ParseState {\n  const lines = text.split('\\n');\n  let { blocks, buffer } = state;\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i]!;\n\n    if (line.length > 0) {\n      buffer = [...buffer, createTextNode(line, attrs, blockAttributes)];\n    }\n\n    const isNewline = i < lines.length - 1;\n    if (isNewline) {\n      const { blockType, blockAttrs } = extractBlockInfo(attrs, blockAttributes);\n      blocks = [...blocks, createBlock(blockType, blockAttrs, buffer)];\n      buffer = [];\n    }\n  }\n\n  return { blocks, buffer };\n}\n\nfunction processEmbedOp(\n  state: ParseState,\n  insert: Record<string, unknown>,\n  attrs: Attributes,\n  blockEmbeds: Set<string>,\n): ParseState {\n  const embed = parseEmbedOp(insert, attrs);\n\n  if (blockEmbeds.has(embed.type)) {\n    const blocks =\n      state.buffer.length > 0\n        ? [...state.blocks, createBlock('paragraph', {}, state.buffer), embed]\n        : [...state.blocks, embed];\n    return { blocks, buffer: [] };\n  }\n\n  return { blocks: state.blocks, buffer: [...state.buffer, embed] };\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────────────\n\nfunction extractBlockInfo(\n  attrs: Attributes,\n  blockAttributes: ParserConfig['blockAttributes'],\n): { blockType: string; blockAttrs: Attributes } {\n  const blockAttrs: Attributes = {};\n  let blockType = 'paragraph';\n\n  for (const [key, value] of Object.entries(attrs)) {\n    const handler = blockAttributes[key];\n    if (handler) {\n      const result = handler(value);\n      if (result.blockType) {\n        blockType = result.blockType;\n      }\n      Object.assign(blockAttrs, result.blockAttrs);\n    }\n  }\n\n  return { blockType, blockAttrs };\n}\n\nfunction createTextNode(\n  text: string,\n  attrs: Attributes,\n  blockAttributes: ParserConfig['blockAttributes'],\n): TNode {\n  const inlineAttrs: Attributes = {};\n  for (const [key, value] of Object.entries(attrs)) {\n    if (!blockAttributes[key]) {\n      inlineAttrs[key] = value;\n    }\n  }\n\n  return {\n    type: 'text',\n    attributes: inlineAttrs,\n    children: [],\n    data: text,\n    isInline: true,\n  };\n}\n\nfunction parseEmbedOp(insert: Record<string, unknown>, attrs: Attributes): TNode {\n  const entries = Object.entries(insert);\n  if (entries.length === 0) {\n    throw new TypeError('parseEmbedOp: received an empty embed object with no type key');\n  }\n\n  const [embedType, embedData] = entries[0]!;\n\n  return {\n    type: embedType,\n    attributes: attrs,\n    children: [],\n    data: embedData as TNode['data'],\n    isInline: false,\n  };\n}\n\nfunction createBlock(type: string, attrs: Attributes, children: TNode[]): TNode {\n  return {\n    type,\n    attributes: attrs,\n    children: [...children],\n    isInline: false,\n  };\n}\n"]}