{
  "version": 3,
  "sources": ["../../../src/diagrams/railroad/parser/abnfParser.ts", "../../../src/diagrams/railroad/abnfDiagram.ts"],
  "sourcesContent": ["import {\n  MermaidParseError,\n  createRailroadAbnfServices,\n  type RailroadAbnf,\n  type AbnfAlternation,\n  type AbnfConcatenation,\n  type AbnfElement,\n  type AbnfGroup,\n  type AbnfNumVal,\n  type AbnfOptionalGroup,\n  type AbnfPrimary,\n  type AbnfRule as LangiumAbnfRule,\n  type AbnfRuleName,\n  type AbnfStringLiteral,\n} from '@mermaid-js/parser';\n\nimport type { ParserDefinition } from '../../../diagram-api/types.js';\nimport { log } from '../../../logger.js';\nimport { populateCommonDb } from '../../common/populateCommonDb.js';\nimport { db } from '../railroadDb.js';\nimport type { ASTNode, RailroadRule } from '../railroadTypes.js';\n\nconst langiumParser = createRailroadAbnfServices().RailroadAbnf.parser.LangiumParser;\n\nconst transformAlternation = (alt: AbnfAlternation): ASTNode => {\n  const alternatives = alt.alternatives.map(transformConcatenation);\n\n  if (alternatives.length === 1) {\n    return alternatives[0];\n  }\n\n  return {\n    type: 'choice',\n    alternatives,\n  };\n};\n\nconst transformConcatenation = (concat: AbnfConcatenation): ASTNode => {\n  const elements = concat.elements.map(transformElement);\n\n  if (elements.length === 1) {\n    return elements[0];\n  }\n\n  return {\n    type: 'sequence',\n    elements,\n  };\n};\n\nconst parseRepeat = (repeat: string): { min: number; max: number } => {\n  if (repeat.includes('*')) {\n    const [minStr, maxStr] = repeat.split('*');\n    const min = minStr ? parseInt(minStr, 10) : 0;\n    const max = maxStr ? parseInt(maxStr, 10) : Infinity;\n    return { min, max };\n  }\n  // Exact repeat: \"3\" means exactly 3\n  const exact = parseInt(repeat, 10);\n  return { min: exact, max: exact };\n};\n\nconst transformElement = (element: AbnfElement): ASTNode => {\n  const inner = transformPrimary(element.primary);\n\n  if (!element.repeat) {\n    return inner;\n  }\n\n  const { min, max } = parseRepeat(element.repeat);\n\n  if (min === 0 && max === 1) {\n    return { type: 'optional', element: inner };\n  }\n\n  return {\n    type: 'repetition',\n    element: inner,\n    min,\n    max,\n  };\n};\n\nconst transformPrimary = (primary: AbnfPrimary): ASTNode => {\n  switch (primary.$type) {\n    case 'AbnfStringLiteral':\n      return {\n        type: 'terminal',\n        value: (primary as AbnfStringLiteral).value,\n      };\n    case 'AbnfNumVal':\n      return {\n        type: 'terminal',\n        value: (primary as AbnfNumVal).value,\n      };\n    case 'AbnfRuleName':\n      return {\n        type: 'nonterminal',\n        name: (primary as AbnfRuleName).name,\n      };\n    case 'AbnfGroup':\n      return transformAlternation((primary as AbnfGroup).element);\n    case 'AbnfOptionalGroup':\n      return {\n        type: 'optional',\n        element: transformAlternation((primary as AbnfOptionalGroup).element),\n      };\n    default:\n      throw new Error(`Unsupported ABNF primary node: ${primary.$type}`);\n  }\n};\n\nconst transformRule = (rule: LangiumAbnfRule): RailroadRule => {\n  return {\n    name: rule.name,\n    definition: transformAlternation(rule.definition),\n  };\n};\n\nconst populateDb = (ast: RailroadAbnf): void => {\n  populateCommonDb(ast, db);\n\n  if (ast.title) {\n    db.setTitle(ast.title);\n  }\n\n  ast.rules.map((rule) => db.addRule(transformRule(rule)));\n};\n\nexport const parser: ParserDefinition = {\n  parse: (input: string): void => {\n    db.clear();\n    log.debug('[ABNF Parser] Starting Langium parse');\n\n    const result = langiumParser.parse<RailroadAbnf>(input);\n    if (result.lexerErrors.length > 0 || result.parserErrors.length > 0) {\n      throw new MermaidParseError(result);\n    }\n\n    const ast = result.value;\n    log.debug('[ABNF Parser] Parsed rules:', ast.rules.length);\n\n    populateDb(ast);\n    log.debug('[ABNF Parser] Parse complete');\n  },\n  parser: {\n    yy: db,\n  },\n};\n\nexport default parser;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './parser/abnfParser.js';\nimport { db } from './railroadDb.js';\nimport { renderer } from './railroadRenderer.js';\nimport { getStyles } from './styles.js';\n\nexport const diagram: DiagramDefinition = {\n  parser,\n  db,\n  renderer,\n  styles: getStyles,\n};\n"],
  "mappings": "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",
  "names": []
}
