🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@create-markdown/mdx

Package Overview
Dependencies
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@create-markdown/mdx - npm Package Compare versions

Comparing version
1.0.0
to
1.0.1
+1
-1
dist/index.cjs

@@ -387,3 +387,3 @@ "use strict";

var import_core2 = require("@create-markdown/core");
var VERSION = "1.0.0";
var VERSION = "1.0.1";
// Annotate the CommonJS export names for ESM import in node:

@@ -390,0 +390,0 @@ 0 && (module.exports = {

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/index.ts","../src/serializer.ts","../src/converter.ts"],"sourcesContent":["/**\n * @create-markdown/mdx\n * Convert markdown blocks to MDX with component mappings\n */\n\n// ============================================================================\n// Serialization\n// ============================================================================\n\nexport { blocksToMDX, blocksToMDXWithMeta } from './serializer';\n\n// ============================================================================\n// Conversion Utilities\n// ============================================================================\n\nexport {\n markdownToMDX,\n markdownToMDXWithMeta,\n convertFile,\n convertDirectory,\n docsPreset,\n minimalPreset,\n} from './converter';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n ComponentMappings,\n MDXFrontmatter,\n MDXSerializeOptions,\n ResolvedMDXOptions,\n MDXConversionResult,\n ConvertOptions,\n} from './types';\n\n// ============================================================================\n// Re-exports from core for convenience\n// ============================================================================\n\nexport { parse, stringify } from '@create-markdown/core';\nexport type { Block, TextSpan, BlockType } from '@create-markdown/core';\n\n// ============================================================================\n// Package Info\n// ============================================================================\n\n/**\n * Package version\n */\nexport const VERSION = '1.0.0';\n","/**\n * @create-markdown/mdx - MDX Serializer\n * Convert blocks to MDX with component support\n */\n\nimport type {\n Block,\n TextSpan,\n HeadingBlock,\n CodeBlockBlock,\n CalloutBlock,\n TableBlock,\n ImageBlock,\n CheckListBlock,\n} from '@create-markdown/core';\n\nimport type {\n MDXSerializeOptions,\n ResolvedMDXOptions,\n MDXConversionResult,\n MDXFrontmatter,\n} from './types';\n\n// ============================================================================\n// Default Options\n// ============================================================================\n\nconst DEFAULT_OPTIONS: ResolvedMDXOptions = {\n components: {},\n useJSX: true,\n imports: [],\n frontmatter: {},\n extractTitle: true,\n lineEnding: '\\n',\n};\n\n/**\n * Resolves options with defaults\n */\nfunction resolveOptions(options?: MDXSerializeOptions): ResolvedMDXOptions {\n return {\n ...DEFAULT_OPTIONS,\n ...options,\n components: { ...DEFAULT_OPTIONS.components, ...options?.components },\n frontmatter: { ...DEFAULT_OPTIONS.frontmatter, ...options?.frontmatter },\n imports: options?.imports ?? DEFAULT_OPTIONS.imports,\n };\n}\n\n// ============================================================================\n// Main Serializer\n// ============================================================================\n\n/**\n * Converts blocks to MDX string\n */\nexport function blocksToMDX(\n blocks: Block[],\n options?: MDXSerializeOptions\n): string {\n const result = blocksToMDXWithMeta(blocks, options);\n return result.content;\n}\n\n/**\n * Converts blocks to MDX string with extracted metadata\n */\nexport function blocksToMDXWithMeta(\n blocks: Block[],\n options?: MDXSerializeOptions\n): MDXConversionResult {\n const opts = resolveOptions(options);\n const parts: string[] = [];\n const headings: MDXConversionResult['headings'] = [];\n let extractedTitle: string | undefined;\n\n // Extract title from first H1 if enabled\n if (opts.extractTitle && blocks.length > 0) {\n const firstBlock = blocks[0];\n if (firstBlock.type === 'heading' && (firstBlock as HeadingBlock).props.level === 1) {\n extractedTitle = spansToPlainText(firstBlock.content);\n }\n }\n\n // Build frontmatter\n const frontmatter: MDXFrontmatter = {\n ...opts.frontmatter,\n };\n if (extractedTitle && !frontmatter.title) {\n frontmatter.title = extractedTitle;\n }\n\n // Add frontmatter if present\n if (Object.keys(frontmatter).length > 0) {\n parts.push(serializeFrontmatter(frontmatter, opts.lineEnding));\n }\n\n // Add imports\n if (opts.imports.length > 0) {\n parts.push(opts.imports.join(opts.lineEnding));\n parts.push('');\n }\n\n // Serialize blocks\n for (const block of blocks) {\n const serialized = serializeBlock(block, opts, headings);\n if (serialized) {\n parts.push(serialized);\n }\n }\n\n return {\n content: parts.join(opts.lineEnding + opts.lineEnding),\n title: extractedTitle,\n headings,\n };\n}\n\n// ============================================================================\n// Frontmatter Serialization\n// ============================================================================\n\n/**\n * Serializes frontmatter to YAML format\n */\nfunction serializeFrontmatter(\n meta: MDXFrontmatter,\n lineEnding: string\n): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(meta)) {\n if (value === undefined || value === null) continue;\n\n if (typeof value === 'string') {\n // Escape quotes in strings\n const escaped = value.replace(/\"/g, '\\\\\"');\n lines.push(`${key}: \"${escaped}\"`);\n } else if (typeof value === 'boolean' || typeof value === 'number') {\n lines.push(`${key}: ${value}`);\n } else if (Array.isArray(value)) {\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - \"${item}\"`);\n }\n } else {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n }\n }\n\n lines.push('---');\n return lines.join(lineEnding);\n}\n\n// ============================================================================\n// Block Serialization\n// ============================================================================\n\n/**\n * Serializes a single block to MDX\n */\nfunction serializeBlock(\n block: Block,\n opts: ResolvedMDXOptions,\n headings: MDXConversionResult['headings']\n): string {\n switch (block.type) {\n case 'heading':\n return serializeHeading(block as HeadingBlock, opts, headings);\n\n case 'paragraph':\n return serializeInlineContent(block.content, opts);\n\n case 'codeBlock':\n return serializeCodeBlock(block as CodeBlockBlock, opts);\n\n case 'callout':\n return serializeCallout(block as CalloutBlock, opts);\n\n case 'table':\n return serializeTable(block as TableBlock, opts);\n\n case 'image':\n return serializeImage(block as ImageBlock, opts);\n\n case 'bulletList':\n return serializeBulletList(block, opts);\n\n case 'numberedList':\n return serializeNumberedList(block, opts);\n\n case 'checkList':\n return serializeCheckList(block as CheckListBlock, opts);\n\n case 'blockquote':\n return serializeBlockquote(block, opts);\n\n case 'divider':\n return '---';\n\n default:\n return serializeInlineContent(block.content, opts);\n }\n}\n\n/**\n * Serializes heading block\n */\nfunction serializeHeading(\n block: HeadingBlock,\n opts: ResolvedMDXOptions,\n headings: MDXConversionResult['headings']\n): string {\n const content = serializeInlineContent(block.content, opts);\n const level = block.props.level;\n const id = slugify(spansToPlainText(block.content));\n\n // Track heading for TOC\n headings.push({\n level,\n text: spansToPlainText(block.content),\n id,\n });\n\n // If custom Heading component, use JSX\n if (opts.components.heading && opts.useJSX) {\n return `<${opts.components.heading} level={${level}} id=\"${id}\">${content}</${opts.components.heading}>`;\n }\n\n return `${'#'.repeat(level)} ${content}`;\n}\n\n/**\n * Serializes code block\n */\nfunction serializeCodeBlock(\n block: CodeBlockBlock,\n opts: ResolvedMDXOptions\n): string {\n const code = spansToPlainText(block.content);\n const lang = block.props.language || '';\n\n // If custom CodeBlock component, use JSX\n if (opts.components.codeBlock && opts.useJSX) {\n // Escape backticks and dollar signs for template literal\n const escapedCode = code\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$/g, '\\\\$');\n return `<${opts.components.codeBlock} language=\"${lang}\">{\\`${escapedCode}\\`}</${opts.components.codeBlock}>`;\n }\n\n // Standard fenced code block (works in MDX)\n return `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``;\n}\n\n/**\n * Serializes callout block\n */\nfunction serializeCallout(\n block: CalloutBlock,\n opts: ResolvedMDXOptions\n): string {\n const content = serializeInlineContent(block.content, opts);\n const type = block.props.type;\n\n // Use JSX component for callouts\n if (opts.components.callout && opts.useJSX) {\n return `<${opts.components.callout} type=\"${type}\">\\n${content}\\n</${opts.components.callout}>`;\n }\n\n // GitHub-style callout syntax\n return `> [!${type.toUpperCase()}]\\n> ${content}`;\n}\n\n/**\n * Serializes table block\n */\nfunction serializeTable(\n block: TableBlock,\n opts: ResolvedMDXOptions\n): string {\n const { headers, rows, alignments } = block.props;\n\n // Use JSX component for tables\n if (opts.components.table && opts.useJSX) {\n return `<${opts.components.table}\n headers={${JSON.stringify(headers)}}\n rows={${JSON.stringify(rows)}}${alignments ? `\\n alignments={${JSON.stringify(alignments)}}` : ''}\n/>`;\n }\n\n // Standard markdown table\n const headerRow = `| ${headers.join(' | ')} |`;\n const separator = `| ${headers.map((_, i) => {\n const align = alignments?.[i];\n if (align === 'left') return ':---';\n if (align === 'right') return '---:';\n if (align === 'center') return ':---:';\n return '---';\n }).join(' | ')} |`;\n const dataRows = rows.map(row => `| ${row.join(' | ')} |`).join('\\n');\n\n return `${headerRow}\\n${separator}\\n${dataRows}`;\n}\n\n/**\n * Serializes image block\n */\nfunction serializeImage(\n block: ImageBlock,\n opts: ResolvedMDXOptions\n): string {\n const { url, alt, title, width, height } = block.props;\n\n // Use JSX component for images (e.g., Next.js Image)\n if (opts.components.image && opts.useJSX) {\n const props = [\n `src=\"${url}\"`,\n `alt=\"${alt || ''}\"`,\n ];\n if (title) props.push(`title=\"${title}\"`);\n if (width) props.push(`width={${width}}`);\n if (height) props.push(`height={${height}}`);\n \n return `<${opts.components.image} ${props.join(' ')} />`;\n }\n\n // Standard markdown image\n if (title) {\n return `![${alt || ''}](${url} \"${title}\")`;\n }\n return `![${alt || ''}](${url})`;\n}\n\n/**\n * Serializes bullet list\n */\nfunction serializeBulletList(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n return block.children\n .map(child => `- ${serializeInlineContent(child.content, opts)}`)\n .join('\\n');\n}\n\n/**\n * Serializes numbered list\n */\nfunction serializeNumberedList(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n return block.children\n .map((child, i) => `${i + 1}. ${serializeInlineContent(child.content, opts)}`)\n .join('\\n');\n}\n\n/**\n * Serializes checklist\n */\nfunction serializeCheckList(\n block: CheckListBlock,\n opts: ResolvedMDXOptions\n): string {\n const checked = block.props.checked ? 'x' : ' ';\n return `- [${checked}] ${serializeInlineContent(block.content, opts)}`;\n}\n\n/**\n * Serializes blockquote\n */\nfunction serializeBlockquote(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n const content = serializeInlineContent(block.content, opts);\n\n if (opts.components.blockquote && opts.useJSX) {\n return `<${opts.components.blockquote}>${content}</${opts.components.blockquote}>`;\n }\n\n return content\n .split('\\n')\n .map(line => `> ${line}`)\n .join('\\n');\n}\n\n// ============================================================================\n// Inline Content Serialization\n// ============================================================================\n\n/**\n * Serializes inline content (text spans with styles)\n */\nfunction serializeInlineContent(\n spans: TextSpan[],\n opts: ResolvedMDXOptions\n): string {\n return spans.map(span => serializeSpan(span, opts)).join('');\n}\n\n/**\n * Serializes a single text span with styles\n */\nfunction serializeSpan(\n span: TextSpan,\n opts: ResolvedMDXOptions\n): string {\n let text = span.text;\n const styles = span.styles;\n\n // If no styles, return plain text\n if (!hasStyles(styles)) {\n return text;\n }\n\n // Apply styles from innermost to outermost\n if (styles.code) {\n text = `\\`${text}\\``;\n }\n\n if (styles.highlight) {\n // MDX supports JSX, so use <mark>\n text = `<mark>${text}</mark>`;\n }\n\n if (styles.strikethrough) {\n text = `~~${text}~~`;\n }\n\n if (styles.underline) {\n text = `<u>${text}</u>`;\n }\n\n if (styles.bold && styles.italic) {\n text = `***${text}***`;\n } else {\n if (styles.italic) {\n text = `*${text}*`;\n }\n if (styles.bold) {\n text = `**${text}**`;\n }\n }\n\n // Link (outermost)\n if (styles.link) {\n const { url, title } = styles.link;\n \n if (opts.components.link && opts.useJSX) {\n const titleAttr = title ? ` title=\"${title}\"` : '';\n text = `<${opts.components.link} href=\"${url}\"${titleAttr}>${text}</${opts.components.link}>`;\n } else if (title) {\n text = `[${text}](${url} \"${title}\")`;\n } else {\n text = `[${text}](${url})`;\n }\n }\n\n return text;\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Checks if style object has any active styles\n */\nfunction hasStyles(styles: TextSpan['styles']): boolean {\n return !!(\n styles.bold ||\n styles.italic ||\n styles.underline ||\n styles.strikethrough ||\n styles.code ||\n styles.highlight ||\n styles.link\n );\n}\n\n/**\n * Extracts plain text from spans\n */\nfunction spansToPlainText(spans: TextSpan[]): string {\n return spans.map(span => span.text).join('');\n}\n\n/**\n * Converts text to URL-friendly slug\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n","/**\n * @create-markdown/mdx - Conversion Utilities\n * File-based MD to MDX conversion\n */\n\nimport { parse } from '@create-markdown/core';\nimport { access, mkdir, readdir, readFile as readNodeFile, writeFile as writeNodeFile } from 'node:fs/promises';\nimport { basename, dirname, join, relative } from 'node:path';\nimport { blocksToMDX, blocksToMDXWithMeta } from './serializer';\nimport type { MDXSerializeOptions, ConvertOptions, MDXConversionResult } from './types';\n\n// ============================================================================\n// String Conversion\n// ============================================================================\n\n/**\n * Converts markdown string to MDX string\n */\nexport function markdownToMDX(\n markdown: string,\n options?: MDXSerializeOptions\n): string {\n const blocks = parse(markdown);\n return blocksToMDX(blocks, options);\n}\n\n/**\n * Converts markdown string to MDX with extracted metadata\n */\nexport function markdownToMDXWithMeta(\n markdown: string,\n options?: MDXSerializeOptions\n): MDXConversionResult {\n const blocks = parse(markdown);\n return blocksToMDXWithMeta(blocks, options);\n}\n\n// ============================================================================\n// File Conversion\n// ============================================================================\n\n/**\n * Reads a file and returns its contents\n * Works in Node.js environments\n */\nasync function readFile(path: string): Promise<string> {\n return readNodeFile(path, 'utf-8');\n}\n\n/**\n * Writes content to a file\n * Works in Node.js environments\n */\nasync function writeFile(path: string, content: string): Promise<void> {\n await writeNodeFile(path, content, 'utf-8');\n}\n\n/**\n * Checks if a file exists\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Creates directory if it doesn't exist\n */\nasync function ensureDir(path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n}\n\n/**\n * Converts a markdown file to MDX\n */\nexport async function convertFile(\n inputPath: string,\n outputPath: string,\n options?: ConvertOptions\n): Promise<MDXConversionResult> {\n const markdown = await readFile(inputPath);\n const result = markdownToMDXWithMeta(markdown, options);\n \n // Check if output exists and overwrite is disabled\n if (!options?.overwrite && await fileExists(outputPath)) {\n throw new Error(`Output file already exists: ${outputPath}. Use overwrite: true to replace.`);\n }\n \n // Ensure output directory exists\n await ensureDir(outputPath);\n \n // Write the MDX content\n await writeFile(outputPath, result.content);\n \n return result;\n}\n\n/**\n * Batch converts a directory of markdown files to MDX\n */\nexport async function convertDirectory(\n inputDir: string,\n outputDir: string,\n options?: ConvertOptions\n): Promise<Array<{ input: string; output: string; result: MDXConversionResult }>> {\n const results: Array<{ input: string; output: string; result: MDXConversionResult }> = [];\n \n // Find all markdown files recursively\n async function* walkDir(dir: string): AsyncGenerator<string> {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDir(fullPath);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n yield fullPath;\n }\n }\n }\n \n // Process each file\n for await (const inputPath of walkDir(inputDir)) {\n const relativePath = relative(inputDir, inputPath);\n const ext = options?.extension ?? '.mdx';\n const outputPath = join(\n outputDir,\n dirname(relativePath),\n basename(relativePath, '.md') + ext\n );\n \n try {\n const result = await convertFile(inputPath, outputPath, options);\n results.push({ input: inputPath, output: outputPath, result });\n } catch (error) {\n if (options?.overwrite !== false) {\n throw error;\n }\n // Skip existing files when overwrite is disabled\n console.warn(`Skipping existing file: ${outputPath}`);\n }\n }\n \n return results;\n}\n\n// ============================================================================\n// Conversion Presets\n// ============================================================================\n\n/**\n * Preset options for docs site conversion\n */\nexport const docsPreset: MDXSerializeOptions = {\n useJSX: true,\n extractTitle: true,\n components: {\n codeBlock: 'CodeBlock',\n callout: 'Callout',\n image: 'Image',\n link: 'Link',\n },\n imports: [\n \"import { CodeBlock } from '@/components/docs/code-block'\",\n \"import { Callout } from '@/components/docs/callout'\",\n \"import Image from 'next/image'\",\n \"import Link from 'next/link'\",\n ],\n};\n\n/**\n * Preset for minimal MDX (no custom components)\n */\nexport const minimalPreset: MDXSerializeOptions = {\n useJSX: false,\n extractTitle: true,\n components: {},\n imports: [],\n};\n"],"mappings":"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","names":["readNodeFile","writeNodeFile","import_core"]}
{"version":3,"sources":["../src/index.ts","../src/serializer.ts","../src/converter.ts"],"sourcesContent":["/**\n * @create-markdown/mdx\n * Convert markdown blocks to MDX with component mappings\n */\n\n// ============================================================================\n// Serialization\n// ============================================================================\n\nexport { blocksToMDX, blocksToMDXWithMeta } from './serializer';\n\n// ============================================================================\n// Conversion Utilities\n// ============================================================================\n\nexport {\n markdownToMDX,\n markdownToMDXWithMeta,\n convertFile,\n convertDirectory,\n docsPreset,\n minimalPreset,\n} from './converter';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n ComponentMappings,\n MDXFrontmatter,\n MDXSerializeOptions,\n ResolvedMDXOptions,\n MDXConversionResult,\n ConvertOptions,\n} from './types';\n\n// ============================================================================\n// Re-exports from core for convenience\n// ============================================================================\n\nexport { parse, stringify } from '@create-markdown/core';\nexport type { Block, TextSpan, BlockType } from '@create-markdown/core';\n\n// ============================================================================\n// Package Info\n// ============================================================================\n\n/**\n * Package version\n */\nexport const VERSION = '1.0.1';\n","/**\n * @create-markdown/mdx - MDX Serializer\n * Convert blocks to MDX with component support\n */\n\nimport type {\n Block,\n TextSpan,\n HeadingBlock,\n CodeBlockBlock,\n CalloutBlock,\n TableBlock,\n ImageBlock,\n CheckListBlock,\n} from '@create-markdown/core';\n\nimport type {\n MDXSerializeOptions,\n ResolvedMDXOptions,\n MDXConversionResult,\n MDXFrontmatter,\n} from './types';\n\n// ============================================================================\n// Default Options\n// ============================================================================\n\nconst DEFAULT_OPTIONS: ResolvedMDXOptions = {\n components: {},\n useJSX: true,\n imports: [],\n frontmatter: {},\n extractTitle: true,\n lineEnding: '\\n',\n};\n\n/**\n * Resolves options with defaults\n */\nfunction resolveOptions(options?: MDXSerializeOptions): ResolvedMDXOptions {\n return {\n ...DEFAULT_OPTIONS,\n ...options,\n components: { ...DEFAULT_OPTIONS.components, ...options?.components },\n frontmatter: { ...DEFAULT_OPTIONS.frontmatter, ...options?.frontmatter },\n imports: options?.imports ?? DEFAULT_OPTIONS.imports,\n };\n}\n\n// ============================================================================\n// Main Serializer\n// ============================================================================\n\n/**\n * Converts blocks to MDX string\n */\nexport function blocksToMDX(\n blocks: Block[],\n options?: MDXSerializeOptions\n): string {\n const result = blocksToMDXWithMeta(blocks, options);\n return result.content;\n}\n\n/**\n * Converts blocks to MDX string with extracted metadata\n */\nexport function blocksToMDXWithMeta(\n blocks: Block[],\n options?: MDXSerializeOptions\n): MDXConversionResult {\n const opts = resolveOptions(options);\n const parts: string[] = [];\n const headings: MDXConversionResult['headings'] = [];\n let extractedTitle: string | undefined;\n\n // Extract title from first H1 if enabled\n if (opts.extractTitle && blocks.length > 0) {\n const firstBlock = blocks[0];\n if (firstBlock.type === 'heading' && (firstBlock as HeadingBlock).props.level === 1) {\n extractedTitle = spansToPlainText(firstBlock.content);\n }\n }\n\n // Build frontmatter\n const frontmatter: MDXFrontmatter = {\n ...opts.frontmatter,\n };\n if (extractedTitle && !frontmatter.title) {\n frontmatter.title = extractedTitle;\n }\n\n // Add frontmatter if present\n if (Object.keys(frontmatter).length > 0) {\n parts.push(serializeFrontmatter(frontmatter, opts.lineEnding));\n }\n\n // Add imports\n if (opts.imports.length > 0) {\n parts.push(opts.imports.join(opts.lineEnding));\n parts.push('');\n }\n\n // Serialize blocks\n for (const block of blocks) {\n const serialized = serializeBlock(block, opts, headings);\n if (serialized) {\n parts.push(serialized);\n }\n }\n\n return {\n content: parts.join(opts.lineEnding + opts.lineEnding),\n title: extractedTitle,\n headings,\n };\n}\n\n// ============================================================================\n// Frontmatter Serialization\n// ============================================================================\n\n/**\n * Serializes frontmatter to YAML format\n */\nfunction serializeFrontmatter(\n meta: MDXFrontmatter,\n lineEnding: string\n): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(meta)) {\n if (value === undefined || value === null) continue;\n\n if (typeof value === 'string') {\n // Escape quotes in strings\n const escaped = value.replace(/\"/g, '\\\\\"');\n lines.push(`${key}: \"${escaped}\"`);\n } else if (typeof value === 'boolean' || typeof value === 'number') {\n lines.push(`${key}: ${value}`);\n } else if (Array.isArray(value)) {\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - \"${item}\"`);\n }\n } else {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n }\n }\n\n lines.push('---');\n return lines.join(lineEnding);\n}\n\n// ============================================================================\n// Block Serialization\n// ============================================================================\n\n/**\n * Serializes a single block to MDX\n */\nfunction serializeBlock(\n block: Block,\n opts: ResolvedMDXOptions,\n headings: MDXConversionResult['headings']\n): string {\n switch (block.type) {\n case 'heading':\n return serializeHeading(block as HeadingBlock, opts, headings);\n\n case 'paragraph':\n return serializeInlineContent(block.content, opts);\n\n case 'codeBlock':\n return serializeCodeBlock(block as CodeBlockBlock, opts);\n\n case 'callout':\n return serializeCallout(block as CalloutBlock, opts);\n\n case 'table':\n return serializeTable(block as TableBlock, opts);\n\n case 'image':\n return serializeImage(block as ImageBlock, opts);\n\n case 'bulletList':\n return serializeBulletList(block, opts);\n\n case 'numberedList':\n return serializeNumberedList(block, opts);\n\n case 'checkList':\n return serializeCheckList(block as CheckListBlock, opts);\n\n case 'blockquote':\n return serializeBlockquote(block, opts);\n\n case 'divider':\n return '---';\n\n default:\n return serializeInlineContent(block.content, opts);\n }\n}\n\n/**\n * Serializes heading block\n */\nfunction serializeHeading(\n block: HeadingBlock,\n opts: ResolvedMDXOptions,\n headings: MDXConversionResult['headings']\n): string {\n const content = serializeInlineContent(block.content, opts);\n const level = block.props.level;\n const id = slugify(spansToPlainText(block.content));\n\n // Track heading for TOC\n headings.push({\n level,\n text: spansToPlainText(block.content),\n id,\n });\n\n // If custom Heading component, use JSX\n if (opts.components.heading && opts.useJSX) {\n return `<${opts.components.heading} level={${level}} id=\"${id}\">${content}</${opts.components.heading}>`;\n }\n\n return `${'#'.repeat(level)} ${content}`;\n}\n\n/**\n * Serializes code block\n */\nfunction serializeCodeBlock(\n block: CodeBlockBlock,\n opts: ResolvedMDXOptions\n): string {\n const code = spansToPlainText(block.content);\n const lang = block.props.language || '';\n\n // If custom CodeBlock component, use JSX\n if (opts.components.codeBlock && opts.useJSX) {\n // Escape backticks and dollar signs for template literal\n const escapedCode = code\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$/g, '\\\\$');\n return `<${opts.components.codeBlock} language=\"${lang}\">{\\`${escapedCode}\\`}</${opts.components.codeBlock}>`;\n }\n\n // Standard fenced code block (works in MDX)\n return `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``;\n}\n\n/**\n * Serializes callout block\n */\nfunction serializeCallout(\n block: CalloutBlock,\n opts: ResolvedMDXOptions\n): string {\n const content = serializeInlineContent(block.content, opts);\n const type = block.props.type;\n\n // Use JSX component for callouts\n if (opts.components.callout && opts.useJSX) {\n return `<${opts.components.callout} type=\"${type}\">\\n${content}\\n</${opts.components.callout}>`;\n }\n\n // GitHub-style callout syntax\n return `> [!${type.toUpperCase()}]\\n> ${content}`;\n}\n\n/**\n * Serializes table block\n */\nfunction serializeTable(\n block: TableBlock,\n opts: ResolvedMDXOptions\n): string {\n const { headers, rows, alignments } = block.props;\n\n // Use JSX component for tables\n if (opts.components.table && opts.useJSX) {\n return `<${opts.components.table}\n headers={${JSON.stringify(headers)}}\n rows={${JSON.stringify(rows)}}${alignments ? `\\n alignments={${JSON.stringify(alignments)}}` : ''}\n/>`;\n }\n\n // Standard markdown table\n const headerRow = `| ${headers.join(' | ')} |`;\n const separator = `| ${headers.map((_, i) => {\n const align = alignments?.[i];\n if (align === 'left') return ':---';\n if (align === 'right') return '---:';\n if (align === 'center') return ':---:';\n return '---';\n }).join(' | ')} |`;\n const dataRows = rows.map(row => `| ${row.join(' | ')} |`).join('\\n');\n\n return `${headerRow}\\n${separator}\\n${dataRows}`;\n}\n\n/**\n * Serializes image block\n */\nfunction serializeImage(\n block: ImageBlock,\n opts: ResolvedMDXOptions\n): string {\n const { url, alt, title, width, height } = block.props;\n\n // Use JSX component for images (e.g., Next.js Image)\n if (opts.components.image && opts.useJSX) {\n const props = [\n `src=\"${url}\"`,\n `alt=\"${alt || ''}\"`,\n ];\n if (title) props.push(`title=\"${title}\"`);\n if (width) props.push(`width={${width}}`);\n if (height) props.push(`height={${height}}`);\n \n return `<${opts.components.image} ${props.join(' ')} />`;\n }\n\n // Standard markdown image\n if (title) {\n return `![${alt || ''}](${url} \"${title}\")`;\n }\n return `![${alt || ''}](${url})`;\n}\n\n/**\n * Serializes bullet list\n */\nfunction serializeBulletList(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n return block.children\n .map(child => `- ${serializeInlineContent(child.content, opts)}`)\n .join('\\n');\n}\n\n/**\n * Serializes numbered list\n */\nfunction serializeNumberedList(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n return block.children\n .map((child, i) => `${i + 1}. ${serializeInlineContent(child.content, opts)}`)\n .join('\\n');\n}\n\n/**\n * Serializes checklist\n */\nfunction serializeCheckList(\n block: CheckListBlock,\n opts: ResolvedMDXOptions\n): string {\n const checked = block.props.checked ? 'x' : ' ';\n return `- [${checked}] ${serializeInlineContent(block.content, opts)}`;\n}\n\n/**\n * Serializes blockquote\n */\nfunction serializeBlockquote(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n const content = serializeInlineContent(block.content, opts);\n\n if (opts.components.blockquote && opts.useJSX) {\n return `<${opts.components.blockquote}>${content}</${opts.components.blockquote}>`;\n }\n\n return content\n .split('\\n')\n .map(line => `> ${line}`)\n .join('\\n');\n}\n\n// ============================================================================\n// Inline Content Serialization\n// ============================================================================\n\n/**\n * Serializes inline content (text spans with styles)\n */\nfunction serializeInlineContent(\n spans: TextSpan[],\n opts: ResolvedMDXOptions\n): string {\n return spans.map(span => serializeSpan(span, opts)).join('');\n}\n\n/**\n * Serializes a single text span with styles\n */\nfunction serializeSpan(\n span: TextSpan,\n opts: ResolvedMDXOptions\n): string {\n let text = span.text;\n const styles = span.styles;\n\n // If no styles, return plain text\n if (!hasStyles(styles)) {\n return text;\n }\n\n // Apply styles from innermost to outermost\n if (styles.code) {\n text = `\\`${text}\\``;\n }\n\n if (styles.highlight) {\n // MDX supports JSX, so use <mark>\n text = `<mark>${text}</mark>`;\n }\n\n if (styles.strikethrough) {\n text = `~~${text}~~`;\n }\n\n if (styles.underline) {\n text = `<u>${text}</u>`;\n }\n\n if (styles.bold && styles.italic) {\n text = `***${text}***`;\n } else {\n if (styles.italic) {\n text = `*${text}*`;\n }\n if (styles.bold) {\n text = `**${text}**`;\n }\n }\n\n // Link (outermost)\n if (styles.link) {\n const { url, title } = styles.link;\n \n if (opts.components.link && opts.useJSX) {\n const titleAttr = title ? ` title=\"${title}\"` : '';\n text = `<${opts.components.link} href=\"${url}\"${titleAttr}>${text}</${opts.components.link}>`;\n } else if (title) {\n text = `[${text}](${url} \"${title}\")`;\n } else {\n text = `[${text}](${url})`;\n }\n }\n\n return text;\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Checks if style object has any active styles\n */\nfunction hasStyles(styles: TextSpan['styles']): boolean {\n return !!(\n styles.bold ||\n styles.italic ||\n styles.underline ||\n styles.strikethrough ||\n styles.code ||\n styles.highlight ||\n styles.link\n );\n}\n\n/**\n * Extracts plain text from spans\n */\nfunction spansToPlainText(spans: TextSpan[]): string {\n return spans.map(span => span.text).join('');\n}\n\n/**\n * Converts text to URL-friendly slug\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n","/**\n * @create-markdown/mdx - Conversion Utilities\n * File-based MD to MDX conversion\n */\n\nimport { parse } from '@create-markdown/core';\nimport { access, mkdir, readdir, readFile as readNodeFile, writeFile as writeNodeFile } from 'node:fs/promises';\nimport { basename, dirname, join, relative } from 'node:path';\nimport { blocksToMDX, blocksToMDXWithMeta } from './serializer';\nimport type { MDXSerializeOptions, ConvertOptions, MDXConversionResult } from './types';\n\n// ============================================================================\n// String Conversion\n// ============================================================================\n\n/**\n * Converts markdown string to MDX string\n */\nexport function markdownToMDX(\n markdown: string,\n options?: MDXSerializeOptions\n): string {\n const blocks = parse(markdown);\n return blocksToMDX(blocks, options);\n}\n\n/**\n * Converts markdown string to MDX with extracted metadata\n */\nexport function markdownToMDXWithMeta(\n markdown: string,\n options?: MDXSerializeOptions\n): MDXConversionResult {\n const blocks = parse(markdown);\n return blocksToMDXWithMeta(blocks, options);\n}\n\n// ============================================================================\n// File Conversion\n// ============================================================================\n\n/**\n * Reads a file and returns its contents\n * Works in Node.js environments\n */\nasync function readFile(path: string): Promise<string> {\n return readNodeFile(path, 'utf-8');\n}\n\n/**\n * Writes content to a file\n * Works in Node.js environments\n */\nasync function writeFile(path: string, content: string): Promise<void> {\n await writeNodeFile(path, content, 'utf-8');\n}\n\n/**\n * Checks if a file exists\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Creates directory if it doesn't exist\n */\nasync function ensureDir(path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n}\n\n/**\n * Converts a markdown file to MDX\n */\nexport async function convertFile(\n inputPath: string,\n outputPath: string,\n options?: ConvertOptions\n): Promise<MDXConversionResult> {\n const markdown = await readFile(inputPath);\n const result = markdownToMDXWithMeta(markdown, options);\n \n // Check if output exists and overwrite is disabled\n if (!options?.overwrite && await fileExists(outputPath)) {\n throw new Error(`Output file already exists: ${outputPath}. Use overwrite: true to replace.`);\n }\n \n // Ensure output directory exists\n await ensureDir(outputPath);\n \n // Write the MDX content\n await writeFile(outputPath, result.content);\n \n return result;\n}\n\n/**\n * Batch converts a directory of markdown files to MDX\n */\nexport async function convertDirectory(\n inputDir: string,\n outputDir: string,\n options?: ConvertOptions\n): Promise<Array<{ input: string; output: string; result: MDXConversionResult }>> {\n const results: Array<{ input: string; output: string; result: MDXConversionResult }> = [];\n \n // Find all markdown files recursively\n async function* walkDir(dir: string): AsyncGenerator<string> {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDir(fullPath);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n yield fullPath;\n }\n }\n }\n \n // Process each file\n for await (const inputPath of walkDir(inputDir)) {\n const relativePath = relative(inputDir, inputPath);\n const ext = options?.extension ?? '.mdx';\n const outputPath = join(\n outputDir,\n dirname(relativePath),\n basename(relativePath, '.md') + ext\n );\n \n try {\n const result = await convertFile(inputPath, outputPath, options);\n results.push({ input: inputPath, output: outputPath, result });\n } catch (error) {\n if (options?.overwrite !== false) {\n throw error;\n }\n // Skip existing files when overwrite is disabled\n console.warn(`Skipping existing file: ${outputPath}`);\n }\n }\n \n return results;\n}\n\n// ============================================================================\n// Conversion Presets\n// ============================================================================\n\n/**\n * Preset options for docs site conversion\n */\nexport const docsPreset: MDXSerializeOptions = {\n useJSX: true,\n extractTitle: true,\n components: {\n codeBlock: 'CodeBlock',\n callout: 'Callout',\n image: 'Image',\n link: 'Link',\n },\n imports: [\n \"import { CodeBlock } from '@/components/docs/code-block'\",\n \"import { Callout } from '@/components/docs/callout'\",\n \"import Image from 'next/image'\",\n \"import Link from 'next/link'\",\n ],\n};\n\n/**\n * Preset for minimal MDX (no custom components)\n */\nexport const minimalPreset: MDXSerializeOptions = {\n useJSX: false,\n extractTitle: true,\n components: {},\n imports: [],\n};\n"],"mappings":"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","names":["readNodeFile","writeNodeFile","import_core"]}

@@ -13,3 +13,3 @@ /**

*/
export declare const VERSION = "1.0.0";
export declare const VERSION = "1.0.1";
//# sourceMappingURL=index.d.ts.map

@@ -351,3 +351,3 @@ // src/serializer.ts

import { parse as parse2, stringify } from "@create-markdown/core";
var VERSION = "1.0.0";
var VERSION = "1.0.1";
export {

@@ -354,0 +354,0 @@ VERSION,

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/serializer.ts","../src/converter.ts","../src/index.ts"],"sourcesContent":["/**\n * @create-markdown/mdx - MDX Serializer\n * Convert blocks to MDX with component support\n */\n\nimport type {\n Block,\n TextSpan,\n HeadingBlock,\n CodeBlockBlock,\n CalloutBlock,\n TableBlock,\n ImageBlock,\n CheckListBlock,\n} from '@create-markdown/core';\n\nimport type {\n MDXSerializeOptions,\n ResolvedMDXOptions,\n MDXConversionResult,\n MDXFrontmatter,\n} from './types';\n\n// ============================================================================\n// Default Options\n// ============================================================================\n\nconst DEFAULT_OPTIONS: ResolvedMDXOptions = {\n components: {},\n useJSX: true,\n imports: [],\n frontmatter: {},\n extractTitle: true,\n lineEnding: '\\n',\n};\n\n/**\n * Resolves options with defaults\n */\nfunction resolveOptions(options?: MDXSerializeOptions): ResolvedMDXOptions {\n return {\n ...DEFAULT_OPTIONS,\n ...options,\n components: { ...DEFAULT_OPTIONS.components, ...options?.components },\n frontmatter: { ...DEFAULT_OPTIONS.frontmatter, ...options?.frontmatter },\n imports: options?.imports ?? DEFAULT_OPTIONS.imports,\n };\n}\n\n// ============================================================================\n// Main Serializer\n// ============================================================================\n\n/**\n * Converts blocks to MDX string\n */\nexport function blocksToMDX(\n blocks: Block[],\n options?: MDXSerializeOptions\n): string {\n const result = blocksToMDXWithMeta(blocks, options);\n return result.content;\n}\n\n/**\n * Converts blocks to MDX string with extracted metadata\n */\nexport function blocksToMDXWithMeta(\n blocks: Block[],\n options?: MDXSerializeOptions\n): MDXConversionResult {\n const opts = resolveOptions(options);\n const parts: string[] = [];\n const headings: MDXConversionResult['headings'] = [];\n let extractedTitle: string | undefined;\n\n // Extract title from first H1 if enabled\n if (opts.extractTitle && blocks.length > 0) {\n const firstBlock = blocks[0];\n if (firstBlock.type === 'heading' && (firstBlock as HeadingBlock).props.level === 1) {\n extractedTitle = spansToPlainText(firstBlock.content);\n }\n }\n\n // Build frontmatter\n const frontmatter: MDXFrontmatter = {\n ...opts.frontmatter,\n };\n if (extractedTitle && !frontmatter.title) {\n frontmatter.title = extractedTitle;\n }\n\n // Add frontmatter if present\n if (Object.keys(frontmatter).length > 0) {\n parts.push(serializeFrontmatter(frontmatter, opts.lineEnding));\n }\n\n // Add imports\n if (opts.imports.length > 0) {\n parts.push(opts.imports.join(opts.lineEnding));\n parts.push('');\n }\n\n // Serialize blocks\n for (const block of blocks) {\n const serialized = serializeBlock(block, opts, headings);\n if (serialized) {\n parts.push(serialized);\n }\n }\n\n return {\n content: parts.join(opts.lineEnding + opts.lineEnding),\n title: extractedTitle,\n headings,\n };\n}\n\n// ============================================================================\n// Frontmatter Serialization\n// ============================================================================\n\n/**\n * Serializes frontmatter to YAML format\n */\nfunction serializeFrontmatter(\n meta: MDXFrontmatter,\n lineEnding: string\n): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(meta)) {\n if (value === undefined || value === null) continue;\n\n if (typeof value === 'string') {\n // Escape quotes in strings\n const escaped = value.replace(/\"/g, '\\\\\"');\n lines.push(`${key}: \"${escaped}\"`);\n } else if (typeof value === 'boolean' || typeof value === 'number') {\n lines.push(`${key}: ${value}`);\n } else if (Array.isArray(value)) {\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - \"${item}\"`);\n }\n } else {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n }\n }\n\n lines.push('---');\n return lines.join(lineEnding);\n}\n\n// ============================================================================\n// Block Serialization\n// ============================================================================\n\n/**\n * Serializes a single block to MDX\n */\nfunction serializeBlock(\n block: Block,\n opts: ResolvedMDXOptions,\n headings: MDXConversionResult['headings']\n): string {\n switch (block.type) {\n case 'heading':\n return serializeHeading(block as HeadingBlock, opts, headings);\n\n case 'paragraph':\n return serializeInlineContent(block.content, opts);\n\n case 'codeBlock':\n return serializeCodeBlock(block as CodeBlockBlock, opts);\n\n case 'callout':\n return serializeCallout(block as CalloutBlock, opts);\n\n case 'table':\n return serializeTable(block as TableBlock, opts);\n\n case 'image':\n return serializeImage(block as ImageBlock, opts);\n\n case 'bulletList':\n return serializeBulletList(block, opts);\n\n case 'numberedList':\n return serializeNumberedList(block, opts);\n\n case 'checkList':\n return serializeCheckList(block as CheckListBlock, opts);\n\n case 'blockquote':\n return serializeBlockquote(block, opts);\n\n case 'divider':\n return '---';\n\n default:\n return serializeInlineContent(block.content, opts);\n }\n}\n\n/**\n * Serializes heading block\n */\nfunction serializeHeading(\n block: HeadingBlock,\n opts: ResolvedMDXOptions,\n headings: MDXConversionResult['headings']\n): string {\n const content = serializeInlineContent(block.content, opts);\n const level = block.props.level;\n const id = slugify(spansToPlainText(block.content));\n\n // Track heading for TOC\n headings.push({\n level,\n text: spansToPlainText(block.content),\n id,\n });\n\n // If custom Heading component, use JSX\n if (opts.components.heading && opts.useJSX) {\n return `<${opts.components.heading} level={${level}} id=\"${id}\">${content}</${opts.components.heading}>`;\n }\n\n return `${'#'.repeat(level)} ${content}`;\n}\n\n/**\n * Serializes code block\n */\nfunction serializeCodeBlock(\n block: CodeBlockBlock,\n opts: ResolvedMDXOptions\n): string {\n const code = spansToPlainText(block.content);\n const lang = block.props.language || '';\n\n // If custom CodeBlock component, use JSX\n if (opts.components.codeBlock && opts.useJSX) {\n // Escape backticks and dollar signs for template literal\n const escapedCode = code\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$/g, '\\\\$');\n return `<${opts.components.codeBlock} language=\"${lang}\">{\\`${escapedCode}\\`}</${opts.components.codeBlock}>`;\n }\n\n // Standard fenced code block (works in MDX)\n return `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``;\n}\n\n/**\n * Serializes callout block\n */\nfunction serializeCallout(\n block: CalloutBlock,\n opts: ResolvedMDXOptions\n): string {\n const content = serializeInlineContent(block.content, opts);\n const type = block.props.type;\n\n // Use JSX component for callouts\n if (opts.components.callout && opts.useJSX) {\n return `<${opts.components.callout} type=\"${type}\">\\n${content}\\n</${opts.components.callout}>`;\n }\n\n // GitHub-style callout syntax\n return `> [!${type.toUpperCase()}]\\n> ${content}`;\n}\n\n/**\n * Serializes table block\n */\nfunction serializeTable(\n block: TableBlock,\n opts: ResolvedMDXOptions\n): string {\n const { headers, rows, alignments } = block.props;\n\n // Use JSX component for tables\n if (opts.components.table && opts.useJSX) {\n return `<${opts.components.table}\n headers={${JSON.stringify(headers)}}\n rows={${JSON.stringify(rows)}}${alignments ? `\\n alignments={${JSON.stringify(alignments)}}` : ''}\n/>`;\n }\n\n // Standard markdown table\n const headerRow = `| ${headers.join(' | ')} |`;\n const separator = `| ${headers.map((_, i) => {\n const align = alignments?.[i];\n if (align === 'left') return ':---';\n if (align === 'right') return '---:';\n if (align === 'center') return ':---:';\n return '---';\n }).join(' | ')} |`;\n const dataRows = rows.map(row => `| ${row.join(' | ')} |`).join('\\n');\n\n return `${headerRow}\\n${separator}\\n${dataRows}`;\n}\n\n/**\n * Serializes image block\n */\nfunction serializeImage(\n block: ImageBlock,\n opts: ResolvedMDXOptions\n): string {\n const { url, alt, title, width, height } = block.props;\n\n // Use JSX component for images (e.g., Next.js Image)\n if (opts.components.image && opts.useJSX) {\n const props = [\n `src=\"${url}\"`,\n `alt=\"${alt || ''}\"`,\n ];\n if (title) props.push(`title=\"${title}\"`);\n if (width) props.push(`width={${width}}`);\n if (height) props.push(`height={${height}}`);\n \n return `<${opts.components.image} ${props.join(' ')} />`;\n }\n\n // Standard markdown image\n if (title) {\n return `![${alt || ''}](${url} \"${title}\")`;\n }\n return `![${alt || ''}](${url})`;\n}\n\n/**\n * Serializes bullet list\n */\nfunction serializeBulletList(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n return block.children\n .map(child => `- ${serializeInlineContent(child.content, opts)}`)\n .join('\\n');\n}\n\n/**\n * Serializes numbered list\n */\nfunction serializeNumberedList(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n return block.children\n .map((child, i) => `${i + 1}. ${serializeInlineContent(child.content, opts)}`)\n .join('\\n');\n}\n\n/**\n * Serializes checklist\n */\nfunction serializeCheckList(\n block: CheckListBlock,\n opts: ResolvedMDXOptions\n): string {\n const checked = block.props.checked ? 'x' : ' ';\n return `- [${checked}] ${serializeInlineContent(block.content, opts)}`;\n}\n\n/**\n * Serializes blockquote\n */\nfunction serializeBlockquote(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n const content = serializeInlineContent(block.content, opts);\n\n if (opts.components.blockquote && opts.useJSX) {\n return `<${opts.components.blockquote}>${content}</${opts.components.blockquote}>`;\n }\n\n return content\n .split('\\n')\n .map(line => `> ${line}`)\n .join('\\n');\n}\n\n// ============================================================================\n// Inline Content Serialization\n// ============================================================================\n\n/**\n * Serializes inline content (text spans with styles)\n */\nfunction serializeInlineContent(\n spans: TextSpan[],\n opts: ResolvedMDXOptions\n): string {\n return spans.map(span => serializeSpan(span, opts)).join('');\n}\n\n/**\n * Serializes a single text span with styles\n */\nfunction serializeSpan(\n span: TextSpan,\n opts: ResolvedMDXOptions\n): string {\n let text = span.text;\n const styles = span.styles;\n\n // If no styles, return plain text\n if (!hasStyles(styles)) {\n return text;\n }\n\n // Apply styles from innermost to outermost\n if (styles.code) {\n text = `\\`${text}\\``;\n }\n\n if (styles.highlight) {\n // MDX supports JSX, so use <mark>\n text = `<mark>${text}</mark>`;\n }\n\n if (styles.strikethrough) {\n text = `~~${text}~~`;\n }\n\n if (styles.underline) {\n text = `<u>${text}</u>`;\n }\n\n if (styles.bold && styles.italic) {\n text = `***${text}***`;\n } else {\n if (styles.italic) {\n text = `*${text}*`;\n }\n if (styles.bold) {\n text = `**${text}**`;\n }\n }\n\n // Link (outermost)\n if (styles.link) {\n const { url, title } = styles.link;\n \n if (opts.components.link && opts.useJSX) {\n const titleAttr = title ? ` title=\"${title}\"` : '';\n text = `<${opts.components.link} href=\"${url}\"${titleAttr}>${text}</${opts.components.link}>`;\n } else if (title) {\n text = `[${text}](${url} \"${title}\")`;\n } else {\n text = `[${text}](${url})`;\n }\n }\n\n return text;\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Checks if style object has any active styles\n */\nfunction hasStyles(styles: TextSpan['styles']): boolean {\n return !!(\n styles.bold ||\n styles.italic ||\n styles.underline ||\n styles.strikethrough ||\n styles.code ||\n styles.highlight ||\n styles.link\n );\n}\n\n/**\n * Extracts plain text from spans\n */\nfunction spansToPlainText(spans: TextSpan[]): string {\n return spans.map(span => span.text).join('');\n}\n\n/**\n * Converts text to URL-friendly slug\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n","/**\n * @create-markdown/mdx - Conversion Utilities\n * File-based MD to MDX conversion\n */\n\nimport { parse } from '@create-markdown/core';\nimport { access, mkdir, readdir, readFile as readNodeFile, writeFile as writeNodeFile } from 'node:fs/promises';\nimport { basename, dirname, join, relative } from 'node:path';\nimport { blocksToMDX, blocksToMDXWithMeta } from './serializer';\nimport type { MDXSerializeOptions, ConvertOptions, MDXConversionResult } from './types';\n\n// ============================================================================\n// String Conversion\n// ============================================================================\n\n/**\n * Converts markdown string to MDX string\n */\nexport function markdownToMDX(\n markdown: string,\n options?: MDXSerializeOptions\n): string {\n const blocks = parse(markdown);\n return blocksToMDX(blocks, options);\n}\n\n/**\n * Converts markdown string to MDX with extracted metadata\n */\nexport function markdownToMDXWithMeta(\n markdown: string,\n options?: MDXSerializeOptions\n): MDXConversionResult {\n const blocks = parse(markdown);\n return blocksToMDXWithMeta(blocks, options);\n}\n\n// ============================================================================\n// File Conversion\n// ============================================================================\n\n/**\n * Reads a file and returns its contents\n * Works in Node.js environments\n */\nasync function readFile(path: string): Promise<string> {\n return readNodeFile(path, 'utf-8');\n}\n\n/**\n * Writes content to a file\n * Works in Node.js environments\n */\nasync function writeFile(path: string, content: string): Promise<void> {\n await writeNodeFile(path, content, 'utf-8');\n}\n\n/**\n * Checks if a file exists\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Creates directory if it doesn't exist\n */\nasync function ensureDir(path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n}\n\n/**\n * Converts a markdown file to MDX\n */\nexport async function convertFile(\n inputPath: string,\n outputPath: string,\n options?: ConvertOptions\n): Promise<MDXConversionResult> {\n const markdown = await readFile(inputPath);\n const result = markdownToMDXWithMeta(markdown, options);\n \n // Check if output exists and overwrite is disabled\n if (!options?.overwrite && await fileExists(outputPath)) {\n throw new Error(`Output file already exists: ${outputPath}. Use overwrite: true to replace.`);\n }\n \n // Ensure output directory exists\n await ensureDir(outputPath);\n \n // Write the MDX content\n await writeFile(outputPath, result.content);\n \n return result;\n}\n\n/**\n * Batch converts a directory of markdown files to MDX\n */\nexport async function convertDirectory(\n inputDir: string,\n outputDir: string,\n options?: ConvertOptions\n): Promise<Array<{ input: string; output: string; result: MDXConversionResult }>> {\n const results: Array<{ input: string; output: string; result: MDXConversionResult }> = [];\n \n // Find all markdown files recursively\n async function* walkDir(dir: string): AsyncGenerator<string> {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDir(fullPath);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n yield fullPath;\n }\n }\n }\n \n // Process each file\n for await (const inputPath of walkDir(inputDir)) {\n const relativePath = relative(inputDir, inputPath);\n const ext = options?.extension ?? '.mdx';\n const outputPath = join(\n outputDir,\n dirname(relativePath),\n basename(relativePath, '.md') + ext\n );\n \n try {\n const result = await convertFile(inputPath, outputPath, options);\n results.push({ input: inputPath, output: outputPath, result });\n } catch (error) {\n if (options?.overwrite !== false) {\n throw error;\n }\n // Skip existing files when overwrite is disabled\n console.warn(`Skipping existing file: ${outputPath}`);\n }\n }\n \n return results;\n}\n\n// ============================================================================\n// Conversion Presets\n// ============================================================================\n\n/**\n * Preset options for docs site conversion\n */\nexport const docsPreset: MDXSerializeOptions = {\n useJSX: true,\n extractTitle: true,\n components: {\n codeBlock: 'CodeBlock',\n callout: 'Callout',\n image: 'Image',\n link: 'Link',\n },\n imports: [\n \"import { CodeBlock } from '@/components/docs/code-block'\",\n \"import { Callout } from '@/components/docs/callout'\",\n \"import Image from 'next/image'\",\n \"import Link from 'next/link'\",\n ],\n};\n\n/**\n * Preset for minimal MDX (no custom components)\n */\nexport const minimalPreset: MDXSerializeOptions = {\n useJSX: false,\n extractTitle: true,\n components: {},\n imports: [],\n};\n","/**\n * @create-markdown/mdx\n * Convert markdown blocks to MDX with component mappings\n */\n\n// ============================================================================\n// Serialization\n// ============================================================================\n\nexport { blocksToMDX, blocksToMDXWithMeta } from './serializer';\n\n// ============================================================================\n// Conversion Utilities\n// ============================================================================\n\nexport {\n markdownToMDX,\n markdownToMDXWithMeta,\n convertFile,\n convertDirectory,\n docsPreset,\n minimalPreset,\n} from './converter';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n ComponentMappings,\n MDXFrontmatter,\n MDXSerializeOptions,\n ResolvedMDXOptions,\n MDXConversionResult,\n ConvertOptions,\n} from './types';\n\n// ============================================================================\n// Re-exports from core for convenience\n// ============================================================================\n\nexport { parse, stringify } from '@create-markdown/core';\nexport type { Block, TextSpan, BlockType } from '@create-markdown/core';\n\n// ============================================================================\n// Package Info\n// ============================================================================\n\n/**\n * Package version\n */\nexport const VERSION = '1.0.0';\n"],"mappings":"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","names":["parse"]}
{"version":3,"sources":["../src/serializer.ts","../src/converter.ts","../src/index.ts"],"sourcesContent":["/**\n * @create-markdown/mdx - MDX Serializer\n * Convert blocks to MDX with component support\n */\n\nimport type {\n Block,\n TextSpan,\n HeadingBlock,\n CodeBlockBlock,\n CalloutBlock,\n TableBlock,\n ImageBlock,\n CheckListBlock,\n} from '@create-markdown/core';\n\nimport type {\n MDXSerializeOptions,\n ResolvedMDXOptions,\n MDXConversionResult,\n MDXFrontmatter,\n} from './types';\n\n// ============================================================================\n// Default Options\n// ============================================================================\n\nconst DEFAULT_OPTIONS: ResolvedMDXOptions = {\n components: {},\n useJSX: true,\n imports: [],\n frontmatter: {},\n extractTitle: true,\n lineEnding: '\\n',\n};\n\n/**\n * Resolves options with defaults\n */\nfunction resolveOptions(options?: MDXSerializeOptions): ResolvedMDXOptions {\n return {\n ...DEFAULT_OPTIONS,\n ...options,\n components: { ...DEFAULT_OPTIONS.components, ...options?.components },\n frontmatter: { ...DEFAULT_OPTIONS.frontmatter, ...options?.frontmatter },\n imports: options?.imports ?? DEFAULT_OPTIONS.imports,\n };\n}\n\n// ============================================================================\n// Main Serializer\n// ============================================================================\n\n/**\n * Converts blocks to MDX string\n */\nexport function blocksToMDX(\n blocks: Block[],\n options?: MDXSerializeOptions\n): string {\n const result = blocksToMDXWithMeta(blocks, options);\n return result.content;\n}\n\n/**\n * Converts blocks to MDX string with extracted metadata\n */\nexport function blocksToMDXWithMeta(\n blocks: Block[],\n options?: MDXSerializeOptions\n): MDXConversionResult {\n const opts = resolveOptions(options);\n const parts: string[] = [];\n const headings: MDXConversionResult['headings'] = [];\n let extractedTitle: string | undefined;\n\n // Extract title from first H1 if enabled\n if (opts.extractTitle && blocks.length > 0) {\n const firstBlock = blocks[0];\n if (firstBlock.type === 'heading' && (firstBlock as HeadingBlock).props.level === 1) {\n extractedTitle = spansToPlainText(firstBlock.content);\n }\n }\n\n // Build frontmatter\n const frontmatter: MDXFrontmatter = {\n ...opts.frontmatter,\n };\n if (extractedTitle && !frontmatter.title) {\n frontmatter.title = extractedTitle;\n }\n\n // Add frontmatter if present\n if (Object.keys(frontmatter).length > 0) {\n parts.push(serializeFrontmatter(frontmatter, opts.lineEnding));\n }\n\n // Add imports\n if (opts.imports.length > 0) {\n parts.push(opts.imports.join(opts.lineEnding));\n parts.push('');\n }\n\n // Serialize blocks\n for (const block of blocks) {\n const serialized = serializeBlock(block, opts, headings);\n if (serialized) {\n parts.push(serialized);\n }\n }\n\n return {\n content: parts.join(opts.lineEnding + opts.lineEnding),\n title: extractedTitle,\n headings,\n };\n}\n\n// ============================================================================\n// Frontmatter Serialization\n// ============================================================================\n\n/**\n * Serializes frontmatter to YAML format\n */\nfunction serializeFrontmatter(\n meta: MDXFrontmatter,\n lineEnding: string\n): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(meta)) {\n if (value === undefined || value === null) continue;\n\n if (typeof value === 'string') {\n // Escape quotes in strings\n const escaped = value.replace(/\"/g, '\\\\\"');\n lines.push(`${key}: \"${escaped}\"`);\n } else if (typeof value === 'boolean' || typeof value === 'number') {\n lines.push(`${key}: ${value}`);\n } else if (Array.isArray(value)) {\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - \"${item}\"`);\n }\n } else {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n }\n }\n\n lines.push('---');\n return lines.join(lineEnding);\n}\n\n// ============================================================================\n// Block Serialization\n// ============================================================================\n\n/**\n * Serializes a single block to MDX\n */\nfunction serializeBlock(\n block: Block,\n opts: ResolvedMDXOptions,\n headings: MDXConversionResult['headings']\n): string {\n switch (block.type) {\n case 'heading':\n return serializeHeading(block as HeadingBlock, opts, headings);\n\n case 'paragraph':\n return serializeInlineContent(block.content, opts);\n\n case 'codeBlock':\n return serializeCodeBlock(block as CodeBlockBlock, opts);\n\n case 'callout':\n return serializeCallout(block as CalloutBlock, opts);\n\n case 'table':\n return serializeTable(block as TableBlock, opts);\n\n case 'image':\n return serializeImage(block as ImageBlock, opts);\n\n case 'bulletList':\n return serializeBulletList(block, opts);\n\n case 'numberedList':\n return serializeNumberedList(block, opts);\n\n case 'checkList':\n return serializeCheckList(block as CheckListBlock, opts);\n\n case 'blockquote':\n return serializeBlockquote(block, opts);\n\n case 'divider':\n return '---';\n\n default:\n return serializeInlineContent(block.content, opts);\n }\n}\n\n/**\n * Serializes heading block\n */\nfunction serializeHeading(\n block: HeadingBlock,\n opts: ResolvedMDXOptions,\n headings: MDXConversionResult['headings']\n): string {\n const content = serializeInlineContent(block.content, opts);\n const level = block.props.level;\n const id = slugify(spansToPlainText(block.content));\n\n // Track heading for TOC\n headings.push({\n level,\n text: spansToPlainText(block.content),\n id,\n });\n\n // If custom Heading component, use JSX\n if (opts.components.heading && opts.useJSX) {\n return `<${opts.components.heading} level={${level}} id=\"${id}\">${content}</${opts.components.heading}>`;\n }\n\n return `${'#'.repeat(level)} ${content}`;\n}\n\n/**\n * Serializes code block\n */\nfunction serializeCodeBlock(\n block: CodeBlockBlock,\n opts: ResolvedMDXOptions\n): string {\n const code = spansToPlainText(block.content);\n const lang = block.props.language || '';\n\n // If custom CodeBlock component, use JSX\n if (opts.components.codeBlock && opts.useJSX) {\n // Escape backticks and dollar signs for template literal\n const escapedCode = code\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$/g, '\\\\$');\n return `<${opts.components.codeBlock} language=\"${lang}\">{\\`${escapedCode}\\`}</${opts.components.codeBlock}>`;\n }\n\n // Standard fenced code block (works in MDX)\n return `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``;\n}\n\n/**\n * Serializes callout block\n */\nfunction serializeCallout(\n block: CalloutBlock,\n opts: ResolvedMDXOptions\n): string {\n const content = serializeInlineContent(block.content, opts);\n const type = block.props.type;\n\n // Use JSX component for callouts\n if (opts.components.callout && opts.useJSX) {\n return `<${opts.components.callout} type=\"${type}\">\\n${content}\\n</${opts.components.callout}>`;\n }\n\n // GitHub-style callout syntax\n return `> [!${type.toUpperCase()}]\\n> ${content}`;\n}\n\n/**\n * Serializes table block\n */\nfunction serializeTable(\n block: TableBlock,\n opts: ResolvedMDXOptions\n): string {\n const { headers, rows, alignments } = block.props;\n\n // Use JSX component for tables\n if (opts.components.table && opts.useJSX) {\n return `<${opts.components.table}\n headers={${JSON.stringify(headers)}}\n rows={${JSON.stringify(rows)}}${alignments ? `\\n alignments={${JSON.stringify(alignments)}}` : ''}\n/>`;\n }\n\n // Standard markdown table\n const headerRow = `| ${headers.join(' | ')} |`;\n const separator = `| ${headers.map((_, i) => {\n const align = alignments?.[i];\n if (align === 'left') return ':---';\n if (align === 'right') return '---:';\n if (align === 'center') return ':---:';\n return '---';\n }).join(' | ')} |`;\n const dataRows = rows.map(row => `| ${row.join(' | ')} |`).join('\\n');\n\n return `${headerRow}\\n${separator}\\n${dataRows}`;\n}\n\n/**\n * Serializes image block\n */\nfunction serializeImage(\n block: ImageBlock,\n opts: ResolvedMDXOptions\n): string {\n const { url, alt, title, width, height } = block.props;\n\n // Use JSX component for images (e.g., Next.js Image)\n if (opts.components.image && opts.useJSX) {\n const props = [\n `src=\"${url}\"`,\n `alt=\"${alt || ''}\"`,\n ];\n if (title) props.push(`title=\"${title}\"`);\n if (width) props.push(`width={${width}}`);\n if (height) props.push(`height={${height}}`);\n \n return `<${opts.components.image} ${props.join(' ')} />`;\n }\n\n // Standard markdown image\n if (title) {\n return `![${alt || ''}](${url} \"${title}\")`;\n }\n return `![${alt || ''}](${url})`;\n}\n\n/**\n * Serializes bullet list\n */\nfunction serializeBulletList(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n return block.children\n .map(child => `- ${serializeInlineContent(child.content, opts)}`)\n .join('\\n');\n}\n\n/**\n * Serializes numbered list\n */\nfunction serializeNumberedList(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n return block.children\n .map((child, i) => `${i + 1}. ${serializeInlineContent(child.content, opts)}`)\n .join('\\n');\n}\n\n/**\n * Serializes checklist\n */\nfunction serializeCheckList(\n block: CheckListBlock,\n opts: ResolvedMDXOptions\n): string {\n const checked = block.props.checked ? 'x' : ' ';\n return `- [${checked}] ${serializeInlineContent(block.content, opts)}`;\n}\n\n/**\n * Serializes blockquote\n */\nfunction serializeBlockquote(\n block: Block,\n opts: ResolvedMDXOptions\n): string {\n const content = serializeInlineContent(block.content, opts);\n\n if (opts.components.blockquote && opts.useJSX) {\n return `<${opts.components.blockquote}>${content}</${opts.components.blockquote}>`;\n }\n\n return content\n .split('\\n')\n .map(line => `> ${line}`)\n .join('\\n');\n}\n\n// ============================================================================\n// Inline Content Serialization\n// ============================================================================\n\n/**\n * Serializes inline content (text spans with styles)\n */\nfunction serializeInlineContent(\n spans: TextSpan[],\n opts: ResolvedMDXOptions\n): string {\n return spans.map(span => serializeSpan(span, opts)).join('');\n}\n\n/**\n * Serializes a single text span with styles\n */\nfunction serializeSpan(\n span: TextSpan,\n opts: ResolvedMDXOptions\n): string {\n let text = span.text;\n const styles = span.styles;\n\n // If no styles, return plain text\n if (!hasStyles(styles)) {\n return text;\n }\n\n // Apply styles from innermost to outermost\n if (styles.code) {\n text = `\\`${text}\\``;\n }\n\n if (styles.highlight) {\n // MDX supports JSX, so use <mark>\n text = `<mark>${text}</mark>`;\n }\n\n if (styles.strikethrough) {\n text = `~~${text}~~`;\n }\n\n if (styles.underline) {\n text = `<u>${text}</u>`;\n }\n\n if (styles.bold && styles.italic) {\n text = `***${text}***`;\n } else {\n if (styles.italic) {\n text = `*${text}*`;\n }\n if (styles.bold) {\n text = `**${text}**`;\n }\n }\n\n // Link (outermost)\n if (styles.link) {\n const { url, title } = styles.link;\n \n if (opts.components.link && opts.useJSX) {\n const titleAttr = title ? ` title=\"${title}\"` : '';\n text = `<${opts.components.link} href=\"${url}\"${titleAttr}>${text}</${opts.components.link}>`;\n } else if (title) {\n text = `[${text}](${url} \"${title}\")`;\n } else {\n text = `[${text}](${url})`;\n }\n }\n\n return text;\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Checks if style object has any active styles\n */\nfunction hasStyles(styles: TextSpan['styles']): boolean {\n return !!(\n styles.bold ||\n styles.italic ||\n styles.underline ||\n styles.strikethrough ||\n styles.code ||\n styles.highlight ||\n styles.link\n );\n}\n\n/**\n * Extracts plain text from spans\n */\nfunction spansToPlainText(spans: TextSpan[]): string {\n return spans.map(span => span.text).join('');\n}\n\n/**\n * Converts text to URL-friendly slug\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n","/**\n * @create-markdown/mdx - Conversion Utilities\n * File-based MD to MDX conversion\n */\n\nimport { parse } from '@create-markdown/core';\nimport { access, mkdir, readdir, readFile as readNodeFile, writeFile as writeNodeFile } from 'node:fs/promises';\nimport { basename, dirname, join, relative } from 'node:path';\nimport { blocksToMDX, blocksToMDXWithMeta } from './serializer';\nimport type { MDXSerializeOptions, ConvertOptions, MDXConversionResult } from './types';\n\n// ============================================================================\n// String Conversion\n// ============================================================================\n\n/**\n * Converts markdown string to MDX string\n */\nexport function markdownToMDX(\n markdown: string,\n options?: MDXSerializeOptions\n): string {\n const blocks = parse(markdown);\n return blocksToMDX(blocks, options);\n}\n\n/**\n * Converts markdown string to MDX with extracted metadata\n */\nexport function markdownToMDXWithMeta(\n markdown: string,\n options?: MDXSerializeOptions\n): MDXConversionResult {\n const blocks = parse(markdown);\n return blocksToMDXWithMeta(blocks, options);\n}\n\n// ============================================================================\n// File Conversion\n// ============================================================================\n\n/**\n * Reads a file and returns its contents\n * Works in Node.js environments\n */\nasync function readFile(path: string): Promise<string> {\n return readNodeFile(path, 'utf-8');\n}\n\n/**\n * Writes content to a file\n * Works in Node.js environments\n */\nasync function writeFile(path: string, content: string): Promise<void> {\n await writeNodeFile(path, content, 'utf-8');\n}\n\n/**\n * Checks if a file exists\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Creates directory if it doesn't exist\n */\nasync function ensureDir(path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n}\n\n/**\n * Converts a markdown file to MDX\n */\nexport async function convertFile(\n inputPath: string,\n outputPath: string,\n options?: ConvertOptions\n): Promise<MDXConversionResult> {\n const markdown = await readFile(inputPath);\n const result = markdownToMDXWithMeta(markdown, options);\n \n // Check if output exists and overwrite is disabled\n if (!options?.overwrite && await fileExists(outputPath)) {\n throw new Error(`Output file already exists: ${outputPath}. Use overwrite: true to replace.`);\n }\n \n // Ensure output directory exists\n await ensureDir(outputPath);\n \n // Write the MDX content\n await writeFile(outputPath, result.content);\n \n return result;\n}\n\n/**\n * Batch converts a directory of markdown files to MDX\n */\nexport async function convertDirectory(\n inputDir: string,\n outputDir: string,\n options?: ConvertOptions\n): Promise<Array<{ input: string; output: string; result: MDXConversionResult }>> {\n const results: Array<{ input: string; output: string; result: MDXConversionResult }> = [];\n \n // Find all markdown files recursively\n async function* walkDir(dir: string): AsyncGenerator<string> {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDir(fullPath);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n yield fullPath;\n }\n }\n }\n \n // Process each file\n for await (const inputPath of walkDir(inputDir)) {\n const relativePath = relative(inputDir, inputPath);\n const ext = options?.extension ?? '.mdx';\n const outputPath = join(\n outputDir,\n dirname(relativePath),\n basename(relativePath, '.md') + ext\n );\n \n try {\n const result = await convertFile(inputPath, outputPath, options);\n results.push({ input: inputPath, output: outputPath, result });\n } catch (error) {\n if (options?.overwrite !== false) {\n throw error;\n }\n // Skip existing files when overwrite is disabled\n console.warn(`Skipping existing file: ${outputPath}`);\n }\n }\n \n return results;\n}\n\n// ============================================================================\n// Conversion Presets\n// ============================================================================\n\n/**\n * Preset options for docs site conversion\n */\nexport const docsPreset: MDXSerializeOptions = {\n useJSX: true,\n extractTitle: true,\n components: {\n codeBlock: 'CodeBlock',\n callout: 'Callout',\n image: 'Image',\n link: 'Link',\n },\n imports: [\n \"import { CodeBlock } from '@/components/docs/code-block'\",\n \"import { Callout } from '@/components/docs/callout'\",\n \"import Image from 'next/image'\",\n \"import Link from 'next/link'\",\n ],\n};\n\n/**\n * Preset for minimal MDX (no custom components)\n */\nexport const minimalPreset: MDXSerializeOptions = {\n useJSX: false,\n extractTitle: true,\n components: {},\n imports: [],\n};\n","/**\n * @create-markdown/mdx\n * Convert markdown blocks to MDX with component mappings\n */\n\n// ============================================================================\n// Serialization\n// ============================================================================\n\nexport { blocksToMDX, blocksToMDXWithMeta } from './serializer';\n\n// ============================================================================\n// Conversion Utilities\n// ============================================================================\n\nexport {\n markdownToMDX,\n markdownToMDXWithMeta,\n convertFile,\n convertDirectory,\n docsPreset,\n minimalPreset,\n} from './converter';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n ComponentMappings,\n MDXFrontmatter,\n MDXSerializeOptions,\n ResolvedMDXOptions,\n MDXConversionResult,\n ConvertOptions,\n} from './types';\n\n// ============================================================================\n// Re-exports from core for convenience\n// ============================================================================\n\nexport { parse, stringify } from '@create-markdown/core';\nexport type { Block, TextSpan, BlockType } from '@create-markdown/core';\n\n// ============================================================================\n// Package Info\n// ============================================================================\n\n/**\n * Package version\n */\nexport const VERSION = '1.0.1';\n"],"mappings":"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","names":["parse"]}
{
"name": "@create-markdown/mdx",
"version": "1.0.0",
"version": "1.0.1",
"description": "Convert markdown blocks to MDX with component mappings",

@@ -46,3 +46,4 @@ "author": "Val Alexander <val@viewdue.ai>",

"typescript": "^5.3.0",
"vitest": "^2.1.0"
"vite": "^7.1.11",
"vitest": "^4.1.2"
},

@@ -52,2 +53,5 @@ "peerDependencies": {

},
"publishConfig": {
"access": "public"
},
"engines": {

@@ -54,0 +58,0 @@ "node": ">=20.0.0"