{"version":3,"file":"builder-DkCweirK.cjs","sources":["../src/builder/link-check.ts","../src/builder/builder.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { Lexer, type Token, type TokensList } from 'marked';\nimport type { NavigationItem, LinkCheckResult, LinkIssue, LinkCheckBuildOptions, LinkWarning } from '../types.js';\n\nconst EXTERNAL_PROTOCOL = /^(https?:|mailto:|tel:|data:|ftp:)/i;\n\nfunction parseLinkTarget(raw: string): string {\n  let target = raw.trim();\n  // Marked may surface <...> around autolinks; normalize that away\n  if (target.startsWith('<') && target.endsWith('>')) {\n    target = target.slice(1, -1);\n  }\n  // Drop anything after whitespace (common in malformed links)\n  if (target.includes(' ')) {\n    target = target.split(/\\s+/)[0] ?? target;\n  }\n  return target;\n}\n\nfunction resolveToFileOrMarkdownVariants(resolvedPath: string): string | null {\n  // If it's already a file, use it.\n  if (fs.existsSync(resolvedPath)) {\n    const stat = fs.statSync(resolvedPath);\n    if (stat.isFile()) return resolvedPath;\n    if (stat.isDirectory()) {\n      // For directories, prefer index.md then README.md\n      const indexMd = path.join(resolvedPath, 'index.md');\n      if (fs.existsSync(indexMd) && fs.statSync(indexMd).isFile()) return indexMd;\n      const readme = path.join(resolvedPath, 'README.md');\n      if (fs.existsSync(readme) && fs.statSync(readme).isFile()) return readme;\n      const readmeLower = path.join(resolvedPath, 'readme.md');\n      if (fs.existsSync(readmeLower) && fs.statSync(readmeLower).isFile()) return readmeLower;\n      return null;\n    }\n  }\n\n  // Try markdown variants for extension-less references.\n  const withMd = `${resolvedPath}.md`;\n  if (fs.existsSync(withMd) && fs.statSync(withMd).isFile()) return withMd;\n\n  const asReadme = path.join(resolvedPath, 'README.md');\n  if (fs.existsSync(asReadme) && fs.statSync(asReadme).isFile()) return asReadme;\n\n  const asIndex = path.join(resolvedPath, 'index.md');\n  if (fs.existsSync(asIndex) && fs.statSync(asIndex).isFile()) return asIndex;\n\n  return null;\n}\n\nfunction isExternalLink(target: string): boolean {\n  // Also treat protocol-relative URLs like `//example.com` as external.\n  return EXTERNAL_PROTOCOL.test(target) || target.startsWith('//');\n}\n\nfunction isSiteAbsolute(target: string): boolean {\n  // `/foo/bar` is usually a website route, not a filesystem path. We ignore these by default.\n  return target.startsWith('/') && !target.startsWith('//');\n}\n\nfunction collectNavigationMarkdownFiles(docsRoot: string, navigation: NavigationItem[]): Set<string> {\n  const out = new Set<string>();\n  const rootAbs = path.resolve(docsRoot);\n\n  function visit(items: NavigationItem[]) {\n    for (const item of items) {\n      if (item.path) {\n        out.add(path.resolve(rootAbs, item.path));\n      }\n      if (item.items) visit(item.items);\n    }\n  }\n\n  visit(navigation);\n  return out;\n}\n\nfunction walkMarkedTokens(tokens: Token[] | TokensList, visit: (token: any) => void): void {\n  for (const token of tokens as any[]) {\n    if (!token || typeof token !== 'object') continue;\n    visit(token);\n\n    // Common child token containers in marked\n    if (Array.isArray(token.tokens)) walkMarkedTokens(token.tokens, visit);\n    if (Array.isArray(token.items)) walkMarkedTokens(token.items, visit);\n\n    // Table tokens have nested tokens arrays under header/rows cells\n    if (Array.isArray(token.header)) {\n      for (const cell of token.header) {\n        if (cell?.tokens) walkMarkedTokens(cell.tokens, visit);\n      }\n    }\n    if (Array.isArray(token.rows)) {\n      for (const row of token.rows) {\n        for (const cell of row ?? []) {\n          if (cell?.tokens) walkMarkedTokens(cell.tokens, visit);\n        }\n      }\n    }\n  }\n}\n\nfunction extractLinkTargetsFromMarkdown(markdown: string): string[] {\n  const tokens = Lexer.lex(markdown);\n  const targets: string[] = [];\n\n  walkMarkedTokens(tokens, (token) => {\n    if (token.type === 'link' && typeof token.href === 'string') {\n      targets.push(token.href);\n    }\n    if (token.type === 'image' && typeof token.href === 'string') {\n      targets.push(token.href);\n    }\n  });\n\n  return targets;\n}\n\nexport function checkMarkdownLinksForNavigation(\n  docsRoot: string,\n  navigation: NavigationItem[],\n  options: Pick<LinkCheckBuildOptions, 'warnOnUnindexed'> = {}\n): LinkCheckResult {\n  const rootAbs = path.resolve(docsRoot);\n  const navFiles = collectNavigationMarkdownFiles(rootAbs, navigation);\n\n  const issues: LinkIssue[] = [];\n  const warnings: LinkWarning[] = [];\n\n  const files = [...navFiles];\n\n  for (const fileAbs of files) {\n    let markdown: string;\n    try {\n      markdown = fs.readFileSync(fileAbs, 'utf8');\n    } catch {\n      // If a nav file can't be read, builder validation will already fail elsewhere.\n      continue;\n    }\n\n    const targets = extractLinkTargetsFromMarkdown(markdown);\n    for (const rawTarget of targets) {\n      const target = parseLinkTarget(rawTarget);\n      if (!target) continue;\n      if (isExternalLink(target)) continue;\n      if (isSiteAbsolute(target)) continue;\n\n      // Anchor-only links are allowed and are intentionally not validated right now.\n      // Markpage renderers don't currently standardize heading IDs, so validating\n      // `#some-heading` would create noisy false positives.\n      if (target.startsWith('#')) continue;\n\n      const [pathPartRaw] = target.split('#');\n      const pathPart = pathPartRaw ?? '';\n      if (!pathPart) continue;\n\n      // Prevent weird protocols like `file:` or `javascript:` from being treated as local paths.\n      if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(pathPart)) {\n        issues.push({ file: fileAbs, target, reason: 'unsupported protocol' });\n        continue;\n      }\n\n      const resolvedPath = path.resolve(path.dirname(fileAbs), pathPart);\n      const resolvedFile = resolveToFileOrMarkdownVariants(resolvedPath);\n      if (!resolvedFile) {\n        issues.push({ file: fileAbs, target, reason: 'missing file' });\n        continue;\n      }\n\n      if (options.warnOnUnindexed) {\n        const normalized = path.resolve(resolvedFile);\n        const withinDocs = normalized === rootAbs || normalized.startsWith(`${rootAbs}${path.sep}`);\n        if (withinDocs && normalized.endsWith('.md') && !navFiles.has(normalized)) {\n          warnings.push({\n            file: fileAbs,\n            target,\n            resolvedFile: normalized,\n            reason: 'not in navigation',\n          });\n        }\n      }\n\n      // Anchor checking for target files is intentionally skipped for now (see comment above).\n    }\n  }\n\n  return { filesChecked: files.length, issues, warnings };\n}\n\n","import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';\nimport { join, dirname, relative } from 'path';\nimport { marked } from 'marked';\nimport { buildNavigationTree, validateContentStructure } from './parser.js';\nimport { BuildOptions, BuildResult, NavigationItem, ContentProcessor } from '../types.js';\nimport { checkMarkdownLinksForNavigation } from './link-check.js';\n\nexport class BuilderError extends Error {\n  constructor(message: string, public filePath?: string) {\n    super(message);\n    this.name = 'BuilderError';\n  }\n}\n\nexport interface ContentBundle {\n  [path: string]: string;\n}\n\nexport async function buildPages(\n  contentPath: string,\n  options: BuildOptions = {}\n): Promise<BuildResult> {\n  try {\n    // Validate content structure\n    validateContentStructure(contentPath, { autoDiscover: options.autoDiscover });\n    \n    // Build navigation tree\n    const navigation = buildNavigationTree(contentPath, { autoDiscover: options.autoDiscover });\n    \n    // Bundle markdown content if requested\n    let content: ContentBundle | undefined;\n    if (options.includeContent !== false) {\n      content = bundleMarkdownContent(navigation, contentPath, options);\n    }\n\n    // Optional link checking (warnings-only unless failOnBroken is set)\n    let linkCheck: BuildResult['linkCheck'] | undefined;\n    const linkCheckOptRaw = options.linkCheck;\n    const linkCheckEnabled = !!linkCheckOptRaw;\n    const linkCheckOpt = typeof linkCheckOptRaw === 'object' && linkCheckOptRaw ? linkCheckOptRaw : {};\n\n    if (linkCheckEnabled) {\n      linkCheck = checkMarkdownLinksForNavigation(contentPath, navigation, {\n        warnOnUnindexed: linkCheckOpt.warnOnUnindexed,\n      });\n      if (linkCheckOpt.failOnBroken && linkCheck.issues.length > 0) {\n        throw new BuilderError(\n          `Link check failed: ${linkCheck.issues.length} issue(s) found`,\n          contentPath\n        );\n      }\n    }\n    \n    // Write outputs\n    if (options.appOutput) {\n      await writeAppOutput(navigation, content, options.appOutput);\n    }\n    \n    if (options.websiteOutput) {\n      await writeWebsiteOutput(navigation, options.websiteOutput);\n    }\n    \n    return {\n      navigation,\n      content: content || undefined,\n      linkCheck\n    };\n  } catch (error) {\n    if (error instanceof BuilderError) {\n      throw error;\n    }\n    \n    throw new BuilderError(\n      `Build failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n      contentPath\n    );\n  }\n}\n\nfunction bundleMarkdownContent(\n  navigation: NavigationItem[],\n  basePath: string,\n  options: BuildOptions\n): ContentBundle {\n  const mode = options.contentMode || 'all';\n  return mode === 'index-only'\n    ? bundleNavigationContent(navigation, basePath)\n    : bundleAllMarkdownContent(basePath);\n}\n\nfunction bundleNavigationContent(\n  navigation: NavigationItem[],\n  basePath: string\n): ContentBundle {\n  const content: ContentBundle = {};\n\n  function processItems(items: NavigationItem[]): void {\n    for (const item of items) {\n      if (item.type === 'page' && item.path) {\n        const filePath = join(basePath, item.path);\n        try {\n          const markdownContent = readFileSync(filePath, 'utf-8');\n          content[item.path] = markdownContent;\n        } catch (error) {\n          throw new BuilderError(\n            `Failed to read markdown file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n            filePath\n          );\n        }\n      } else if (item.type === 'section' && item.path) {\n        // Bundle content for sections that have a path (README/index.md files)\n        const filePath = join(basePath, item.path);\n        try {\n          const markdownContent = readFileSync(filePath, 'utf-8');\n          content[item.path] = markdownContent;\n        } catch (error) {\n          throw new BuilderError(\n            `Failed to read section markdown file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n            filePath\n          );\n        }\n      }\n\n      if (item.items) {\n        processItems(item.items);\n      }\n    }\n  }\n\n  processItems(navigation);\n  return content;\n}\n\nfunction bundleAllMarkdownContent(basePath: string): ContentBundle {\n  const content: ContentBundle = {};\n\n  function walk(directory: string): void {\n    let entries;\n    try {\n      entries = readdirSync(directory, { withFileTypes: true });\n    } catch (error) {\n      throw new BuilderError(\n        `Failed to read directory: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        directory\n      );\n    }\n\n    for (const entry of entries) {\n      const entryPath = join(directory, entry.name);\n\n      if (entry.isDirectory()) {\n        if (entry.name.startsWith('.')) {\n          continue;\n        }\n        walk(entryPath);\n        continue;\n      }\n\n      if (entry.isFile() && entry.name.endsWith('.md')) {\n        const relativePath = relative(basePath, entryPath);\n        try {\n          const markdownContent = readFileSync(entryPath, 'utf-8');\n          content[relativePath] = markdownContent;\n        } catch (error) {\n          throw new BuilderError(\n            `Failed to read markdown file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n            entryPath\n          );\n        }\n      }\n    }\n  }\n\n  walk(basePath);\n  return content;\n}\n\nasync function writeAppOutput(\n  navigation: NavigationItem[],\n  content: ContentBundle | undefined,\n  outputPath: string\n): Promise<void> {\n  try {\n    mkdirSync(dirname(outputPath), { recursive: true });\n    \n    // Write navigation\n    const navigationPath = join(outputPath, 'navigation.json');\n    writeFileSync(navigationPath, JSON.stringify(navigation, null, 2));\n    \n    // Write content if available\n    if (content) {\n      const contentPath = join(outputPath, 'content.json');\n      writeFileSync(contentPath, JSON.stringify(content, null, 2));\n    }\n  } catch (error) {\n    throw new BuilderError(\n      `Failed to write app output: ${error instanceof Error ? error.message : 'Unknown error'}`,\n      outputPath\n    );\n  }\n}\n\nasync function writeWebsiteOutput(\n  navigation: NavigationItem[],\n  outputPath: string\n): Promise<void> {\n  try {\n    mkdirSync(dirname(outputPath), { recursive: true });\n    \n    const navigationPath = join(outputPath, 'navigation.json');\n    writeFileSync(navigationPath, JSON.stringify(navigation, null, 2));\n  } catch (error) {\n    throw new BuilderError(\n      `Failed to write website output: ${error instanceof Error ? error.message : 'Unknown error'}`,\n      outputPath\n    );\n  }\n}\n\n// Deprecated: markdown rendering is handled at runtime by renderer packages\nexport function processMarkdown(content: string, processor?: ContentProcessor): string {\n  return processor ? processor.process(content) : content;\n}\n\nexport function generateStaticPages(\n  navigation: NavigationItem[],\n  basePath: string,\n  options: {\n    processor?: ContentProcessor;\n    pageOptions?: {\n      title?: string;\n      baseUrl?: string;\n      css?: string;\n      js?: string;\n    };\n  } = {}\n): Array<{\n  path: string;\n  content: string;\n  html: string;\n}> {\n  const pages: Array<{\n    path: string;\n    content: string;\n    html: string;\n  }> = [];\n  \n  function processItems(items: NavigationItem[]): void {\n    for (const item of items) {\n      if (item.type === 'page' && item.path) {\n        const filePath = join(basePath, item.path);\n        try {\n          const markdownContent = readFileSync(filePath, 'utf-8');\n          const processedMd = processMarkdown(markdownContent, options.processor);\n          const fullHtml = generateHTMLPage(processedMd, item.label, options.pageOptions);\n          \n          pages.push({\n            path: item.path.replace(/\\.md$/, '.html'),\n            content: markdownContent,\n            html: fullHtml\n          });\n        } catch (error) {\n          throw new BuilderError(\n            `Failed to process page ${item.path}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n            filePath\n          );\n        }\n      } else if (item.items) {\n        processItems(item.items);\n      }\n    }\n  }\n  \n  processItems(navigation);\n  return pages;\n}\n\nfunction generateHTMLPage(\n  content: string,\n  title: string,\n  options: {\n    title?: string;\n    baseUrl?: string;\n    css?: string;\n    js?: string;\n  } = {}\n): string {\n  const pageTitle = options.title || title;\n  const baseUrl = options.baseUrl || '';\n  const css = options.css || '';\n  const js = options.js || '';\n  \n  return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>${pageTitle}</title>\n    <base href=\"${baseUrl}\">\n    ${css ? `<style>${css}</style>` : ''}\n</head>\n<body>\n    <div class=\"content\">\n        ${content}\n    </div>\n    ${js ? `<script>${js}</script>` : ''}\n</body>\n</html>`;\n}\n"],"names":["Lexer","validateContentStructure","buildNavigationTree","join","readFileSync","readdirSync","relative","mkdirSync","dirname","writeFileSync"],"mappings":"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"}