{"version":3,"file":"renderer.mjs","names":[],"sources":["../../../src/markdown/renderer.ts"],"sourcesContent":["import { DURATION_DELAY_TRIGGER } from './constants';\nimport type {\n  ParserResult,\n  ParseState,\n  RenderRuleHook,\n  RuleOutput,\n  Rules,\n} from './types';\n\n/**\n * Creates a renderer for AST nodes.\n * Renamed from `reactFor` to be framework-agnostic.\n *\n * @param render - The render function to call for each node\n * @returns A function that renders AST to output\n */\nexport const renderFor =\n  (\n    render: (\n      ast: ParserResult,\n      render: RuleOutput,\n      state: ParseState\n    ) => unknown\n  ) =>\n  (ast: ParserResult | ParserResult[], state: ParseState = {}): any => {\n    const start = performance.now();\n\n    const patchedRender = (\n      ast: ParserResult | ParserResult[],\n      state: ParseState = {}\n    ): any => renderFor(render)(ast, state);\n\n    if (Array.isArray(ast)) {\n      const oldKey = state.key;\n      const result: any[] = [];\n\n      // map nestedOutput over the ast, except group any text\n      // nodes together into a single string output.\n      let lastWasString = false;\n      let renderedIndex = 0;\n\n      for (let i = 0; i < ast.length; i++) {\n        // We clone the state to avoid side effects on other nodes in the same level\n        // while ensuring each non-null rendered node gets a unique, sequential key.\n        const nodeOut = patchedRender(ast[i], { ...state, key: renderedIndex });\n        const isString = typeof nodeOut === 'string';\n\n        if (isString && lastWasString) {\n          result[result.length - 1] =\n            (result[result.length - 1] as string) + nodeOut;\n        } else if (nodeOut !== null) {\n          result.push(nodeOut);\n          renderedIndex++;\n        }\n\n        lastWasString = isString;\n      }\n\n      state.key = oldKey;\n\n      const duration = performance.now() - start;\n      if (duration > DURATION_DELAY_TRIGGER) {\n        console.log(\n          `renderFor (array): ${duration.toFixed(3)}ms, ast length: ${ast.length}`\n        );\n      }\n\n      return result;\n    }\n\n    const result = render(ast, patchedRender as RuleOutput, state);\n\n    const duration = performance.now() - start;\n    if (duration > DURATION_DELAY_TRIGGER) {\n      console.log(\n        `renderFor (single): ${duration.toFixed(3)}ms, ast type: ${(ast as ParserResult).type}`\n      );\n    }\n\n    return result;\n  };\n\n/**\n * Creates a renderer from rules with optional custom render hook.\n *\n * @param rules - The rules object containing _render functions\n * @param userRender - Optional custom render hook for full control\n * @returns A render function for AST nodes\n */\nexport const createRenderer =\n  (rules: Rules, userRender?: RenderRuleHook) =>\n  (ast: ParserResult, render: RuleOutput, state: ParseState): unknown => {\n    const start = performance.now();\n    const renderer = rules[ast.type]?._render;\n\n    const result = userRender\n      ? userRender(() => renderer?.(ast, render, state), ast, render, state)\n      : renderer?.(ast, render, state);\n\n    const duration = performance.now() - start;\n    if (duration > DURATION_DELAY_TRIGGER) {\n      console.log(\n        `createRenderer: ${duration.toFixed(3)}ms, ast type: ${ast.type}, hasUserRender: ${!!userRender}`\n      );\n    }\n\n    return result;\n  };\n"],"mappings":";;;;;;;;;;AAgBA,MAAa,aAET,YAMD,KAAoC,QAAoB,EAAE,KAAU;CACnE,MAAM,QAAQ,YAAY,KAAK;CAE/B,MAAM,iBACJ,KACA,QAAoB,EAAE,KACd,UAAU,OAAO,CAAC,KAAK,MAAM;AAEvC,KAAI,MAAM,QAAQ,IAAI,EAAE;EACtB,MAAM,SAAS,MAAM;EACrB,MAAM,SAAgB,EAAE;EAIxB,IAAI,gBAAgB;EACpB,IAAI,gBAAgB;AAEpB,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;GAGnC,MAAM,UAAU,cAAc,IAAI,IAAI;IAAE,GAAG;IAAO,KAAK;IAAe,CAAC;GACvE,MAAM,WAAW,OAAO,YAAY;AAEpC,OAAI,YAAY,cACd,QAAO,OAAO,SAAS,KACpB,OAAO,OAAO,SAAS,KAAgB;YACjC,YAAY,MAAM;AAC3B,WAAO,KAAK,QAAQ;AACpB;;AAGF,mBAAgB;;AAGlB,QAAM,MAAM;EAEZ,MAAM,WAAW,YAAY,KAAK,GAAG;AACrC,MAAI,cACF,SAAQ,IACN,sBAAsB,SAAS,QAAQ,EAAE,CAAC,kBAAkB,IAAI,SACjE;AAGH,SAAO;;CAGT,MAAM,SAAS,OAAO,KAAK,eAA6B,MAAM;CAE9D,MAAM,WAAW,YAAY,KAAK,GAAG;AACrC,KAAI,cACF,SAAQ,IACN,uBAAuB,SAAS,QAAQ,EAAE,CAAC,gBAAiB,IAAqB,OAClF;AAGH,QAAO;;;;;;;;;AAUX,MAAa,kBACV,OAAc,gBACd,KAAmB,QAAoB,UAA+B;CACrE,MAAM,QAAQ,YAAY,KAAK;CAC/B,MAAM,WAAW,MAAM,IAAI,OAAO;CAElC,MAAM,SAAS,aACX,iBAAiB,WAAW,KAAK,QAAQ,MAAM,EAAE,KAAK,QAAQ,MAAM,GACpE,WAAW,KAAK,QAAQ,MAAM;CAElC,MAAM,WAAW,YAAY,KAAK,GAAG;AACrC,KAAI,cACF,SAAQ,IACN,mBAAmB,SAAS,QAAQ,EAAE,CAAC,gBAAgB,IAAI,KAAK,mBAAmB,CAAC,CAAC,aACtF;AAGH,QAAO"}