{"version":3,"sources":["../src/index.ts","../src/format.ts"],"sourcesContent":["/**\n * @mdxld/types\n *\n * Shared type definitions for MDXLD format packages.\n */\n\nexport * from './format.js'\n","/**\n * @mdxld/types - Format Interface\n *\n * Common interface for all format converters.\n * Similar to JSON.parse/stringify but with fetch() for URLs.\n */\n\n/**\n * Base Format interface that all format converters implement.\n * Provides a consistent API across JSON, YAML, CSV, HTML, Markdown, etc.\n *\n * @example\n * ```ts\n * // All formats follow the same pattern\n * JSON.parse(string)      // Parse string to object\n * JSON.stringify(object)  // Convert object to string\n * JSON.fetch(url)         // Fetch URL and parse response\n *\n * YAML.parse(string)\n * YAML.stringify(object)\n * YAML.fetch(url)\n *\n * CSV.parse(string)\n * CSV.stringify(records)\n * CSV.fetch(url)\n * ```\n */\nexport interface Format<T = unknown, ParseOptions = unknown, StringifyOptions = unknown, Input = string | ArrayBuffer, Output = string | ArrayBuffer> {\n  /**\n   * Parse a string (or ArrayBuffer for binary formats) to the target type.\n   */\n  parse(input: Input, options?: ParseOptions): T\n\n  /**\n   * Convert data to string (or ArrayBuffer for binary formats).\n   * Optional - some formats like PDF are read-only.\n   */\n  stringify?(data: T, options?: StringifyOptions): Output\n\n  /**\n   * Fetch a URL and parse the response as this format.\n   * Handles content-type detection and appropriate parsing.\n   */\n  fetch(url: string, options?: FormatFetchOptions & ParseOptions): Promise<T>\n\n  /** Format name (e.g., 'json', 'yaml', 'csv') */\n  readonly name: string\n\n  /** MIME types this format handles */\n  readonly mimeTypes: readonly string[]\n\n  /** File extensions this format handles (without dot) */\n  readonly extensions: readonly string[]\n}\n\n/**\n * Options for fetching remote resources.\n */\nexport interface FormatFetchOptions {\n  /** Custom fetch headers */\n  headers?: Record<string, string>\n  /** Request timeout in milliseconds */\n  timeout?: number\n  /** Custom fetch implementation */\n  fetch?: typeof globalThis.fetch\n}\n\n/**\n * Format that supports bi-directional conversion (parse and stringify).\n * Use TextFormat for text-only formats, BinaryFormat for binary-only formats.\n */\nexport interface BiDirectionalFormat<T = unknown, ParseOptions = unknown, StringifyOptions = unknown, Input = string | ArrayBuffer, Output = string | ArrayBuffer>\n  extends Format<T, ParseOptions, StringifyOptions, Input, Output> {\n  stringify(data: T, options?: StringifyOptions): Output\n}\n\n/**\n * Text-based format (JSON, YAML, Markdown, HTML, CSV).\n * Input and output are always strings.\n */\nexport interface TextFormat<T = unknown, ParseOptions = unknown, StringifyOptions = unknown>\n  extends BiDirectionalFormat<T, ParseOptions, StringifyOptions, string, string> {\n  stringify(data: T, options?: StringifyOptions): string\n}\n\n/**\n * Binary format (XLSX).\n * Input and output can be ArrayBuffer.\n */\nexport interface BinaryFormat<T = unknown, ParseOptions = unknown, StringifyOptions = unknown>\n  extends BiDirectionalFormat<T, ParseOptions, StringifyOptions, string | ArrayBuffer, ArrayBuffer> {\n  stringify(data: T, options?: StringifyOptions): ArrayBuffer\n}\n\n/**\n * Format that only supports reading (e.g., PDF).\n */\nexport interface ReadOnlyFormat<T = unknown, ParseOptions = unknown>\n  extends Omit<Format<T, ParseOptions, never>, 'stringify'> {\n  readonly readonly: true\n}\n\n/**\n * Format for tabular text data (CSV, TSV).\n */\nexport interface TabularFormat<\n  T = Record<string, unknown>[],\n  ParseOptions = TabularParseOptions,\n  StringifyOptions = TabularStringifyOptions\n> extends TextFormat<T, ParseOptions, StringifyOptions> {\n  /** Get column headers from parsed data */\n  getHeaders(data: T): string[]\n}\n\n/**\n * Format for tabular binary data (XLSX).\n */\nexport interface TabularBinaryFormat<\n  T = Record<string, unknown>[],\n  ParseOptions = TabularParseOptions,\n  StringifyOptions = TabularStringifyOptions\n> extends BinaryFormat<T, ParseOptions, StringifyOptions> {\n  /** Get column headers from parsed data */\n  getHeaders(data: T): string[]\n}\n\nexport interface TabularParseOptions {\n  /** Whether first row contains headers */\n  headers?: boolean | string[]\n  /** Skip empty rows */\n  skipEmpty?: boolean\n  /** Transform values during parsing */\n  transform?: (value: string, column: string) => unknown\n  /** Custom delimiter (for CSV/TSV) */\n  delimiter?: string\n}\n\nexport interface TabularStringifyOptions {\n  /** Include header row */\n  headers?: boolean | string[]\n  /** Custom delimiter (for CSV/TSV) */\n  delimiter?: string\n  /** Quote all values */\n  quoteAll?: boolean\n  /** Line ending style */\n  lineEnding?: '\\n' | '\\r\\n'\n}\n\n/**\n * Format for documents with structured content (HTML, Markdown).\n */\nexport interface DocumentFormat<T = unknown, ParseOptions = unknown, StringifyOptions = unknown>\n  extends TextFormat<T, ParseOptions, StringifyOptions> {\n  /** Extract metadata/frontmatter from document */\n  extractMeta?(input: string): Record<string, unknown>\n}\n\n/**\n * Helper type to create a format object with standard methods.\n */\nexport type CreateFormat<T, PO = unknown, SO = unknown> = {\n  parse: (input: string | ArrayBuffer, options?: PO) => T\n  stringify?: (data: T, options?: SO) => string | ArrayBuffer\n  fetch: (url: string, options?: FormatFetchOptions & PO) => Promise<T>\n  name: string\n  mimeTypes: readonly string[]\n  extensions: readonly string[]\n}\n\n/**\n * Type guard to check if a format supports stringify.\n */\nexport function isBiDirectional<T, PO, SO>(\n  format: Format<T, PO, SO>\n): format is BiDirectionalFormat<T, PO, SO> {\n  return typeof format.stringify === 'function'\n}\n\n/**\n * Type guard to check if a format is read-only.\n */\nexport function isReadOnly<T, PO>(\n  format: Format<T, PO, never>\n): format is ReadOnlyFormat<T, PO> {\n  return 'readonly' in format && (format as ReadOnlyFormat<T, PO>).readonly === true\n}\n\n/**\n * Type guard to check if a format handles tabular data.\n */\nexport function isTabular<T extends Record<string, unknown>[]>(\n  format: Format<T, TabularParseOptions, TabularStringifyOptions>\n): format is TabularFormat<T> {\n  return typeof (format as TabularFormat<T>).getHeaders === 'function'\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC4KO,SAAS,gBACd,QAC0C;AAC1C,SAAO,OAAO,OAAO,cAAc;AACrC;AAKO,SAAS,WACd,QACiC;AACjC,SAAO,cAAc,UAAW,OAAiC,aAAa;AAChF;AAKO,SAAS,UACd,QAC4B;AAC5B,SAAO,OAAQ,OAA4B,eAAe;AAC5D;","names":[]}