{"version":3,"sources":["../../src/core/util/csv.ts","../../src/core/types.ts","../../src/core/util/profile.ts","../../src/core/providers/in-memory.ts","../../src/core/providers/file.ts","../../src/core/providers/schema-file.ts","../../src/node/fs.ts","../../src/node/db/types.ts","../../src/node/db/provider.ts","../../src/node/identity.ts"],"names":["path","basename","extname","readFile"],"mappings":"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","file":"index.cjs","sourcesContent":["// Minimal RFC 4180 CSV parser. Edge-safe (no Node built-ins).\n//\n// Supports:\n//   - Header row (always required)\n//   - Quoted fields with embedded commas, newlines, and \"\" escapes\n//   - CRLF, LF, and CR line endings\n//   - Trailing newline tolerance\n//\n// Does NOT support:\n//   - Custom delimiters (comma only)\n//   - Comment lines\n//   - Skipping rows\n//\n// If we need more, we'll revisit. The Python side uses polars CSV reader;\n// parity tests cover fixture-based compatibility.\n\nexport interface CsvParseResult {\n  headers: string[];\n  rows: Record<string, string>[];\n}\n\nexport function parseCsv(text: string): CsvParseResult {\n  // Strip UTF-8 BOM if present\n  if (text.charCodeAt(0) === 0xfeff) text = text.slice(1);\n\n  const records: string[][] = [];\n  let row: string[] = [];\n  let field = \"\";\n  let inQuotes = false;\n  let i = 0;\n  const n = text.length;\n\n  while (i < n) {\n    const ch = text[i]!;\n\n    if (inQuotes) {\n      if (ch === '\"') {\n        if (i + 1 < n && text[i + 1] === '\"') {\n          field += '\"';\n          i += 2;\n          continue;\n        }\n        inQuotes = false;\n        i++;\n        continue;\n      }\n      field += ch;\n      i++;\n      continue;\n    }\n\n    if (ch === '\"') {\n      inQuotes = true;\n      i++;\n      continue;\n    }\n    if (ch === \",\") {\n      row.push(field);\n      field = \"\";\n      i++;\n      continue;\n    }\n    if (ch === \"\\r\") {\n      // Handle CRLF as single line ending\n      row.push(field);\n      field = \"\";\n      records.push(row);\n      row = [];\n      i++;\n      if (i < n && text[i] === \"\\n\") i++;\n      continue;\n    }\n    if (ch === \"\\n\") {\n      row.push(field);\n      field = \"\";\n      records.push(row);\n      row = [];\n      i++;\n      continue;\n    }\n    field += ch;\n    i++;\n  }\n\n  // Flush final field/row if not empty\n  if (field.length > 0 || row.length > 0) {\n    row.push(field);\n    records.push(row);\n  }\n\n  // Drop trailing empty row (from trailing newline)\n  if (\n    records.length > 0 &&\n    records[records.length - 1]!.length === 1 &&\n    records[records.length - 1]![0] === \"\"\n  ) {\n    records.pop();\n  }\n\n  if (records.length === 0) return { headers: [], rows: [] };\n\n  const headers = records[0]!;\n  const rows: Record<string, string>[] = [];\n  for (let r = 1; r < records.length; r++) {\n    const record = records[r]!;\n    const obj: Record<string, string> = {};\n    for (let c = 0; c < headers.length; c++) {\n      obj[headers[c]!] = record[c] ?? \"\";\n    }\n    rows.push(obj);\n  }\n  return { headers, rows };\n}\n","// Core data types. Mirrors infermap/types.py.\n// Uses interfaces + factory functions instead of classes so results are plain\n// JSON-serializable — important for parity tests and Next.js Server → Client payloads.\n\nexport const VALID_DTYPES = [\n  \"string\",\n  \"integer\",\n  \"float\",\n  \"boolean\",\n  \"date\",\n  \"datetime\",\n] as const;\n\nexport type Dtype = (typeof VALID_DTYPES)[number];\n\nexport interface FieldInfo {\n  name: string;\n  dtype: Dtype;\n  sampleValues: string[];\n  nullRate: number;\n  uniqueRate: number;\n  valueCount: number;\n  metadata: Record<string, unknown>;\n  /** Affix-stripped canonical form populated by the engine. Optional. */\n  canonicalName?: string;\n}\n\nexport interface SchemaInfo {\n  fields: FieldInfo[];\n  sourceName: string;\n  requiredFields: string[];\n}\n\nexport interface ScorerResult {\n  score: number; // clamped to [0, 1]\n  reasoning: string;\n}\n\nexport interface FieldMapping {\n  source: string;\n  target: string;\n  confidence: number;\n  breakdown: Record<string, ScorerResult>;\n  reasoning: string;\n}\n\nexport interface MapResult {\n  mappings: FieldMapping[];\n  unmappedSource: string[];\n  unmappedTarget: string[];\n  warnings: string[];\n  metadata: Record<string, unknown>;\n  scoreMatrix?: Record<string, Record<string, number>>;\n}\n\n// ---------- factories + normalization ----------\n\nconst isValidDtype = (d: unknown): d is Dtype =>\n  typeof d === \"string\" && (VALID_DTYPES as readonly string[]).includes(d);\n\nexport function makeFieldInfo(input: {\n  name: string;\n  dtype?: string;\n  sampleValues?: string[];\n  nullRate?: number;\n  uniqueRate?: number;\n  valueCount?: number;\n  metadata?: Record<string, unknown>;\n}): FieldInfo {\n  return {\n    name: input.name,\n    dtype: isValidDtype(input.dtype) ? input.dtype : \"string\",\n    sampleValues: input.sampleValues ?? [],\n    nullRate: input.nullRate ?? 0,\n    uniqueRate: input.uniqueRate ?? 0,\n    valueCount: input.valueCount ?? 0,\n    metadata: input.metadata ?? {},\n  };\n}\n\nexport function makeSchemaInfo(input: {\n  fields: FieldInfo[];\n  sourceName?: string;\n  requiredFields?: string[];\n}): SchemaInfo {\n  return {\n    fields: input.fields,\n    sourceName: input.sourceName ?? \"\",\n    requiredFields: input.requiredFields ?? [],\n  };\n}\n\nexport function clampScore(score: number): number {\n  if (Number.isNaN(score)) return 0;\n  return Math.max(0, Math.min(1, score));\n}\n\nexport function makeScorerResult(score: number, reasoning: string): ScorerResult {\n  return { score: clampScore(score), reasoning };\n}\n\n// ---------- MapResult helpers (mirror Python .report() / .to_json()) ----------\n\nconst round = (n: number, digits: number): number => {\n  const factor = 10 ** digits;\n  return Math.round(n * factor) / factor;\n};\n\nexport interface MapResultReport {\n  mappings: Array<{\n    source: string;\n    target: string;\n    confidence: number;\n    breakdown: Record<string, { score: number; reasoning: string }>;\n    reasoning: string;\n  }>;\n  unmapped_source: string[];\n  unmapped_target: string[];\n  warnings: string[];\n}\n\nexport function mapResultToReport(result: MapResult): MapResultReport {\n  return {\n    mappings: result.mappings.map((m) => ({\n      source: m.source,\n      target: m.target,\n      confidence: round(m.confidence, 3),\n      breakdown: Object.fromEntries(\n        Object.entries(m.breakdown).map(([k, r]) => [\n          k,\n          { score: round(r.score, 3), reasoning: r.reasoning },\n        ])\n      ),\n      reasoning: m.reasoning,\n    })),\n    unmapped_source: result.unmappedSource,\n    unmapped_target: result.unmappedTarget,\n    warnings: result.warnings,\n  };\n}\n\nexport function mapResultToJson(result: MapResult): string {\n  return JSON.stringify(mapResultToReport(result), null, 2);\n}\n","// Column profiling + dtype inference. Pure functions, edge-safe.\n//\n// These replicate the Python provider profiling logic:\n//   null_rate    = nulls / total\n//   unique_rate  = unique non-null / total\n//   value_count  = total\n//   sample_values = first N non-null values as strings\n//\n// Python uses Polars dtype introspection. We infer dtype from sample values\n// using a conservative heuristic matching Polars' normalized dtype set.\nimport type { Dtype, FieldInfo } from \"../types.js\";\nimport { makeFieldInfo } from \"../types.js\";\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst ISO_DATETIME = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+\\-]\\d{2}:?\\d{2})?$/;\nconst BOOLEAN_VALUES = new Set([\"true\", \"false\", \"True\", \"False\", \"TRUE\", \"FALSE\", \"0\", \"1\"]);\nconst INT_RE = /^-?\\d+$/;\nconst FLOAT_RE = /^-?\\d+\\.\\d+$/;\n\nexport function isNullLike(value: unknown): boolean {\n  if (value === null || value === undefined) return true;\n  if (typeof value === \"string\") {\n    const t = value.trim();\n    return t === \"\" || t.toLowerCase() === \"null\" || t.toLowerCase() === \"nan\";\n  }\n  return false;\n}\n\nexport function inferDtype(values: readonly unknown[]): Dtype {\n  const sample = values.filter((v) => !isNullLike(v));\n  if (sample.length === 0) return \"string\";\n\n  // Check each row with all heuristics; whichever matches every row wins.\n  let allBool = true;\n  let allInt = true;\n  let allFloat = true;\n  let allDate = true;\n  let allDatetime = true;\n\n  for (const v of sample) {\n    // Native types first\n    if (typeof v === \"boolean\") {\n      allInt = false;\n      allFloat = false;\n      allDate = false;\n      allDatetime = false;\n      continue;\n    }\n    if (typeof v === \"number\") {\n      allBool = false;\n      allDate = false;\n      allDatetime = false;\n      if (!Number.isInteger(v)) allInt = false;\n      continue;\n    }\n\n    const s = typeof v === \"string\" ? v.trim() : String(v).trim();\n    if (!BOOLEAN_VALUES.has(s)) allBool = false;\n    if (!INT_RE.test(s)) allInt = false;\n    if (!INT_RE.test(s) && !FLOAT_RE.test(s)) allFloat = false;\n    if (!ISO_DATE.test(s)) allDate = false;\n    if (!ISO_DATETIME.test(s)) allDatetime = false;\n  }\n\n  // Order of preference: boolean → integer → float → date → datetime → string.\n  // Booleans first so \"0\"/\"1\" don't get caught as ints.\n  if (allBool && sample.length > 0) {\n    // Only count as boolean if we saw at least one true/false (not just 0/1)\n    const hasTrueFalse = sample.some((v) => {\n      const s = typeof v === \"string\" ? v.trim().toLowerCase() : String(v).toLowerCase();\n      return s === \"true\" || s === \"false\";\n    });\n    if (hasTrueFalse || sample.every((v) => typeof v === \"boolean\")) return \"boolean\";\n  }\n  if (allInt) return \"integer\";\n  if (allFloat) return \"float\";\n  if (allDate) return \"date\";\n  if (allDatetime) return \"datetime\";\n  return \"string\";\n}\n\nexport interface ProfileStats {\n  nullRate: number;\n  uniqueRate: number;\n  valueCount: number;\n  sampleValues: string[];\n}\n\nexport function profileColumn(\n  values: readonly unknown[],\n  sampleSize = 500\n): ProfileStats {\n  const total = values.length;\n  if (total === 0) {\n    return { nullRate: 0, uniqueRate: 0, valueCount: 0, sampleValues: [] };\n  }\n\n  let nulls = 0;\n  const nonNull: unknown[] = [];\n  for (const v of values) {\n    if (isNullLike(v)) {\n      nulls++;\n    } else {\n      nonNull.push(v);\n    }\n  }\n\n  const uniqueSet = new Set<string>();\n  for (const v of nonNull) uniqueSet.add(String(v));\n\n  const sampleValues = nonNull\n    .slice(0, sampleSize)\n    .map((v) => (typeof v === \"string\" ? v : String(v)));\n\n  return {\n    nullRate: nulls / total,\n    uniqueRate: uniqueSet.size / total,\n    valueCount: total,\n    sampleValues,\n  };\n}\n\nexport function profileFieldFromValues(\n  name: string,\n  values: readonly unknown[],\n  sampleSize = 500\n): FieldInfo {\n  const stats = profileColumn(values, sampleSize);\n  return makeFieldInfo({\n    name,\n    dtype: inferDtype(values),\n    sampleValues: stats.sampleValues,\n    nullRate: stats.nullRate,\n    uniqueRate: stats.uniqueRate,\n    valueCount: stats.valueCount,\n  });\n}\n","// InMemoryProvider — infer schema from an array of plain records.\n// Mirrors infermap/providers/memory.py but narrowed to the edge-safe JS case:\n// we don't carry a Polars/Pandas equivalent, just JSON-shaped data.\nimport type { SchemaInfo, FieldInfo } from \"../types.js\";\nimport { makeSchemaInfo } from \"../types.js\";\nimport { profileFieldFromValues } from \"../util/profile.js\";\n\nexport interface InMemoryOptions {\n  sourceName?: string;\n  sampleSize?: number;\n  /**\n   * Optional column order. If omitted, keys are collected from the union of\n   * the first 100 records in order of first appearance. Providing a fixed\n   * order is recommended for deterministic field ordering across runs.\n   */\n  columns?: string[];\n}\n\nexport function inferSchemaFromRecords(\n  records: readonly Record<string, unknown>[],\n  options: InMemoryOptions = {}\n): SchemaInfo {\n  const sourceName = options.sourceName ?? \"memory\";\n  const sampleSize = options.sampleSize ?? 500;\n\n  let columns = options.columns;\n  if (!columns) {\n    const seen = new Set<string>();\n    const ordered: string[] = [];\n    const scanLimit = Math.min(records.length, 100);\n    for (let i = 0; i < scanLimit; i++) {\n      for (const key of Object.keys(records[i]!)) {\n        if (!seen.has(key)) {\n          seen.add(key);\n          ordered.push(key);\n        }\n      }\n    }\n    columns = ordered;\n  }\n\n  const fields: FieldInfo[] = columns.map((col) => {\n    const values = records.map((r) => r[col]);\n    return profileFieldFromValues(col, values, sampleSize);\n  });\n\n  return makeSchemaInfo({ fields, sourceName });\n}\n\nexport class InMemoryProvider {\n  extract(\n    records: readonly Record<string, unknown>[],\n    options: InMemoryOptions = {}\n  ): SchemaInfo {\n    return inferSchemaFromRecords(records, options);\n  }\n}\n","// FileProvider (edge-safe) — infer schema from CSV or JSON *text*.\n// Node-side wrappers that read from disk live under infermap/node.\nimport type { SchemaInfo } from \"../types.js\";\nimport { parseCsv } from \"../util/csv.js\";\nimport { inferSchemaFromRecords } from \"./in-memory.js\";\n\nexport interface FileProviderOptions {\n  sourceName?: string;\n  sampleSize?: number;\n}\n\nexport function inferSchemaFromCsvText(\n  text: string,\n  options: FileProviderOptions = {}\n): SchemaInfo {\n  const { headers, rows } = parseCsv(text);\n  const inner: Parameters<typeof inferSchemaFromRecords>[1] = {\n    sourceName: options.sourceName ?? \"csv\",\n    columns: headers,\n  };\n  if (options.sampleSize !== undefined) inner.sampleSize = options.sampleSize;\n  return inferSchemaFromRecords(rows, inner);\n}\n\nexport function inferSchemaFromJsonText(\n  text: string,\n  options: FileProviderOptions = {}\n): SchemaInfo {\n  const parsed = JSON.parse(text);\n  if (!Array.isArray(parsed)) {\n    throw new TypeError(\n      \"inferSchemaFromJsonText: JSON root must be an array of records\"\n    );\n  }\n  const inner: Parameters<typeof inferSchemaFromRecords>[1] = {\n    sourceName: options.sourceName ?? \"json\",\n  };\n  if (options.sampleSize !== undefined) inner.sampleSize = options.sampleSize;\n  return inferSchemaFromRecords(parsed as Record<string, unknown>[], inner);\n}\n","// SchemaFileProvider — parses a JSON schema definition file.\n// YAML is not supported in the TS port (JSON-only config decision).\n//\n// Expected shape (matches the Python YAML/JSON schema_file format):\n// {\n//   \"fields\": [\n//     { \"name\": \"customer_id\", \"dtype\": \"string\", \"aliases\": [\"cust_id\"], \"required\": true },\n//     ...\n//   ]\n// }\nimport type { FieldInfo, SchemaInfo } from \"../types.js\";\nimport { makeFieldInfo, makeSchemaInfo } from \"../types.js\";\n\ninterface SchemaFieldEntry {\n  name: string;\n  dtype?: string;\n  aliases?: string[];\n  required?: boolean;\n}\n\ninterface SchemaDefinition {\n  fields: SchemaFieldEntry[];\n}\n\nexport class SchemaParseError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"SchemaParseError\";\n  }\n}\n\nexport function parseSchemaDefinition(\n  json: string | SchemaDefinition,\n  sourceName = \"schema\"\n): SchemaInfo {\n  const raw: unknown = typeof json === \"string\" ? JSON.parse(json) : json;\n  if (!raw || typeof raw !== \"object\" || !(\"fields\" in raw)) {\n    throw new SchemaParseError(\n      \"Schema file must contain a top-level 'fields' key\"\n    );\n  }\n  const rawFields = (raw as { fields: unknown }).fields;\n  if (!Array.isArray(rawFields)) {\n    throw new SchemaParseError(\"Schema file 'fields' must be an array\");\n  }\n\n  const fields: FieldInfo[] = [];\n  const requiredFields: string[] = [];\n\n  for (const entry of rawFields as SchemaFieldEntry[]) {\n    if (!entry || typeof entry.name !== \"string\") {\n      throw new SchemaParseError(\n        \"Each field entry must be an object with a 'name' string\"\n      );\n    }\n    const aliases = Array.isArray(entry.aliases)\n      ? entry.aliases.filter((a): a is string => typeof a === \"string\")\n      : [];\n    const metadata: Record<string, unknown> = {};\n    if (aliases.length > 0) metadata[\"aliases\"] = aliases;\n\n    fields.push(\n      makeFieldInfo({\n        name: entry.name,\n        dtype: entry.dtype ?? \"string\",\n        sampleValues: [],\n        nullRate: 0,\n        uniqueRate: 0,\n        valueCount: 0,\n        metadata,\n      })\n    );\n\n    if (entry.required) requiredFields.push(entry.name);\n  }\n\n  return makeSchemaInfo({ fields, sourceName, requiredFields });\n}\n","// Node-only filesystem wrappers. Read CSV / JSON / schema-definition files\n// from disk and hand off to the edge-safe text-based providers in core.\nimport { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\nimport {\n  inferSchemaFromCsvText,\n  inferSchemaFromJsonText,\n  type FileProviderOptions,\n} from \"../core/providers/file.js\";\nimport { parseSchemaDefinition } from \"../core/providers/schema-file.js\";\nimport type { SchemaInfo } from \"../core/types.js\";\n\nfunction stem(path: string): string {\n  const b = basename(path);\n  const ext = extname(b);\n  return ext ? b.slice(0, -ext.length) : b;\n}\n\nexport async function extractSchemaFromFile(\n  path: string,\n  options: FileProviderOptions = {}\n): Promise<SchemaInfo> {\n  const text = await readFile(path, \"utf8\");\n  const ext = extname(path).toLowerCase();\n  const sourceName = options.sourceName ?? stem(path);\n\n  if (ext === \".csv\") {\n    const opts: FileProviderOptions = { sourceName };\n    if (options.sampleSize !== undefined) opts.sampleSize = options.sampleSize;\n    return inferSchemaFromCsvText(text, opts);\n  }\n  if (ext === \".json\") {\n    // Disambiguate: JSON schema definition (has \"fields\" key) vs. array of records.\n    try {\n      const parsed = JSON.parse(text);\n      if (Array.isArray(parsed)) {\n        const opts: FileProviderOptions = { sourceName };\n        if (options.sampleSize !== undefined) opts.sampleSize = options.sampleSize;\n        return inferSchemaFromJsonText(text, opts);\n      }\n      if (parsed && typeof parsed === \"object\" && \"fields\" in parsed) {\n        return parseSchemaDefinition(text, sourceName);\n      }\n      throw new TypeError(\n        \"JSON file must be either an array of records or a schema definition with a 'fields' key\"\n      );\n    } catch (e) {\n      if (e instanceof SyntaxError) {\n        throw new SyntaxError(`Invalid JSON in ${path}: ${e.message}`);\n      }\n      throw e;\n    }\n  }\n\n  throw new Error(`Unsupported file extension for ${path}: ${ext || \"(none)\"}`);\n}\n","// DB type mapping + URI parsing. Pure functions, no driver deps.\n// Mirrors the helpers in infermap/providers/db.py.\nimport type { Dtype } from \"../../core/types.js\";\n\nexport function sqliteTypeToInfermap(sqliteType: string | null | undefined): Dtype {\n  const t = (sqliteType ?? \"\").toUpperCase().trim();\n  if (t.includes(\"INT\")) return \"integer\";\n  if (/REAL|FLOAT|DOUBLE|NUMERIC|DECIMAL/.test(t)) return \"float\";\n  if (t.includes(\"BOOL\")) return \"boolean\";\n  if (t.includes(\"DATE\") && !t.includes(\"TIME\")) return \"date\";\n  if (t.includes(\"DATETIME\") || t.includes(\"TIMESTAMP\")) return \"datetime\";\n  return \"string\";\n}\n\nexport function pgTypeToInfermap(pgType: string | null | undefined): Dtype {\n  const t = (pgType ?? \"\").toLowerCase().trim();\n  if ([\"integer\", \"bigint\", \"smallint\", \"serial\", \"bigserial\"].includes(t))\n    return \"integer\";\n  if ([\"real\", \"double precision\", \"numeric\", \"decimal\", \"money\"].includes(t))\n    return \"float\";\n  if (t === \"boolean\") return \"boolean\";\n  if (t === \"date\") return \"date\";\n  if (\n    t === \"timestamp\" ||\n    t === \"timestamp with time zone\" ||\n    t === \"timestamp without time zone\"\n  )\n    return \"datetime\";\n  return \"string\";\n}\n\nexport function duckdbTypeToInfermap(\n  duckdbType: string | null | undefined\n): Dtype {\n  const t = (duckdbType ?? \"\").toUpperCase().trim();\n  if (\n    [\n      \"INTEGER\",\n      \"BIGINT\",\n      \"SMALLINT\",\n      \"TINYINT\",\n      \"HUGEINT\",\n      \"INT4\",\n      \"INT8\",\n      \"INT2\",\n      \"INT1\",\n    ].includes(t)\n  )\n    return \"integer\";\n  if (\n    [\"REAL\", \"FLOAT\", \"DOUBLE\", \"DECIMAL\", \"NUMERIC\", \"FLOAT4\", \"FLOAT8\"].includes(\n      t\n    )\n  )\n    return \"float\";\n  if (t === \"BOOLEAN\") return \"boolean\";\n  if (t === \"DATE\") return \"date\";\n  if (\n    t === \"TIMESTAMP\" ||\n    t === \"TIMESTAMP WITH TIME ZONE\" ||\n    t === \"TIMESTAMPTZ\"\n  )\n    return \"datetime\";\n  return \"string\";\n}\n\nexport type DbDriver = \"sqlite\" | \"postgresql\" | \"mysql\" | \"duckdb\";\n\nexport interface SqliteConnInfo {\n  driver: \"sqlite\";\n  path: string;\n}\nexport interface DuckdbConnInfo {\n  driver: \"duckdb\";\n  path: string;\n}\nexport interface PgConnInfo {\n  driver: \"postgresql\";\n  host: string | null;\n  port: number;\n  user: string | null;\n  password: string | null;\n  database: string;\n}\nexport interface MysqlConnInfo {\n  driver: \"mysql\";\n  host: string | null;\n  port: number;\n  user: string | null;\n  password: string | null;\n  database: string;\n}\nexport type ConnInfo = SqliteConnInfo | DuckdbConnInfo | PgConnInfo | MysqlConnInfo;\n\nexport class DbError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"DbError\";\n  }\n}\n\n/**\n * Parse a database URI into normalized ConnInfo.\n * Supported schemes: sqlite, postgresql/postgres, mysql, duckdb.\n */\nexport function parseConnection(uri: string): ConnInfo {\n  let parsed: URL;\n  try {\n    parsed = new URL(uri);\n  } catch {\n    throw new DbError(`Invalid database URI: ${uri}`);\n  }\n  const scheme = parsed.protocol.replace(/:$/, \"\").toLowerCase();\n\n  if (scheme === \"sqlite\") {\n    // sqlite:///path  → pathname starts with /\n    // sqlite:///C:/path on Windows → /C:/path\n    const raw = parsed.pathname;\n    const path = raw.startsWith(\"/\") ? raw.slice(1) : raw;\n    return { driver: \"sqlite\", path: decodeURIComponent(path) };\n  }\n\n  if (scheme === \"duckdb\") {\n    const raw = parsed.pathname;\n    const path = raw.startsWith(\"/\") ? raw.slice(1) : raw;\n    return { driver: \"duckdb\", path: decodeURIComponent(path) };\n  }\n\n  if (scheme === \"postgresql\" || scheme === \"postgres\") {\n    return {\n      driver: \"postgresql\",\n      host: parsed.hostname || null,\n      port: parsed.port ? Number(parsed.port) : 5432,\n      user: parsed.username ? decodeURIComponent(parsed.username) : null,\n      password: parsed.password ? decodeURIComponent(parsed.password) : null,\n      database: parsed.pathname.replace(/^\\//, \"\"),\n    };\n  }\n\n  if (scheme === \"mysql\") {\n    return {\n      driver: \"mysql\",\n      host: parsed.hostname || null,\n      port: parsed.port ? Number(parsed.port) : 3306,\n      user: parsed.username ? decodeURIComponent(parsed.username) : null,\n      password: parsed.password ? decodeURIComponent(parsed.password) : null,\n      database: parsed.pathname.replace(/^\\//, \"\"),\n    };\n  }\n\n  throw new DbError(`Unsupported database scheme: ${scheme}`);\n}\n","// Node-only database provider. Dispatches to the right driver via dynamic\n// import so optional peerDeps (better-sqlite3, pg, @duckdb/node-api) can be\n// absent without breaking the package build.\n//\n// Each driver implementation is small and mirrors the Python provider in\n// infermap/providers/db.py. We return the same FieldInfo shape + source_name\n// convention so downstream engine behavior matches Python.\nimport type { FieldInfo, SchemaInfo } from \"../../core/types.js\";\nimport { makeFieldInfo, makeSchemaInfo } from \"../../core/types.js\";\nimport {\n  DbError,\n  parseConnection,\n  pgTypeToInfermap,\n  sqliteTypeToInfermap,\n  duckdbTypeToInfermap,\n  type ConnInfo,\n} from \"./types.js\";\n\nconst DEFAULT_SAMPLE_SIZE = 500;\n\nexport interface DbExtractOptions {\n  table: string;\n  sampleSize?: number;\n}\n\n/** Extract a SchemaInfo from a database table by URI + table name. */\nexport async function extractDbSchema(\n  uri: string,\n  options: DbExtractOptions\n): Promise<SchemaInfo> {\n  const conn = parseConnection(uri);\n  const sampleSize = options.sampleSize ?? DEFAULT_SAMPLE_SIZE;\n\n  if (conn.driver === \"sqlite\") {\n    return extractSqlite(conn.path, options.table, sampleSize);\n  }\n  if (conn.driver === \"postgresql\") {\n    return extractPostgres(conn, options.table, sampleSize);\n  }\n  if (conn.driver === \"duckdb\") {\n    return extractDuckdb(conn.path, options.table, sampleSize);\n  }\n  if (conn.driver === \"mysql\") {\n    throw new DbError(\"MySQL support is not implemented\");\n  }\n  throw new DbError(`Unsupported driver: ${(conn as ConnInfo).driver}`);\n}\n\n// ---------- SQLite (better-sqlite3) ----------\n\nasync function loadBetterSqlite(): Promise<unknown> {\n  try {\n    // Module not statically typed — it's an optional peerDep, so we\n    // intentionally use a non-literal import specifier to bypass TS resolution.\n    const mod: { default: unknown } = await import(\n      /* @vite-ignore */ \"better-sqlite3\" as string\n    );\n    return mod.default;\n  } catch {\n    throw new DbError(\n      \"better-sqlite3 is required for SQLite. Install it: npm install better-sqlite3\"\n    );\n  }\n}\n\nasync function extractSqlite(\n  path: string,\n  table: string,\n  sampleSize: number\n): Promise<SchemaInfo> {\n  const Database = (await loadBetterSqlite()) as new (\n    path: string,\n    options?: { readonly?: boolean }\n  ) => {\n    prepare(sql: string): {\n      all(...params: unknown[]): unknown[];\n      get(...params: unknown[]): unknown;\n    };\n    close(): void;\n  };\n\n  let db;\n  try {\n    db = new Database(path, { readonly: true });\n  } catch (e) {\n    throw new DbError(\n      `Cannot connect to SQLite database at ${path}: ${String(e)}`\n    );\n  }\n\n  try {\n    const exists = db\n      .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name=?\")\n      .get(table);\n    if (!exists) {\n      throw new DbError(`Table '${table}' not found in SQLite database: ${path}`);\n    }\n\n    type PragmaRow = { cid: number; name: string; type: string };\n    const pragma = db.prepare(`PRAGMA table_info(${table})`).all() as PragmaRow[];\n\n    const quoted = `\"${table.replace(/\"/g, '\"\"')}\"`;\n    const totalRow = db.prepare(`SELECT COUNT(*) AS c FROM ${quoted}`).get() as {\n      c: number;\n    };\n    const total = Number(totalRow.c);\n\n    const sampleRows = db\n      .prepare(`SELECT * FROM ${quoted} LIMIT ?`)\n      .all(sampleSize) as Array<Record<string, unknown>>;\n\n    const fields: FieldInfo[] = [];\n    for (const col of pragma) {\n      const nullRow = db\n        .prepare(\n          `SELECT COUNT(*) AS c FROM ${quoted} WHERE \"${col.name.replace(/\"/g, '\"\"')}\" IS NULL`\n        )\n        .get() as { c: number };\n      const nullCount = Number(nullRow.c);\n      const nullRate = total > 0 ? nullCount / total : 0;\n\n      const rawSamples: unknown[] = [];\n      for (const row of sampleRows) {\n        const v = row[col.name];\n        if (v !== null && v !== undefined) rawSamples.push(v);\n      }\n      const sampleValues = rawSamples\n        .slice(0, sampleSize)\n        .map((v) => String(v));\n      const unique = new Set(rawSamples.map((v) => String(v))).size;\n      const uniqueRate = total > 0 ? unique / total : 0;\n\n      fields.push(\n        makeFieldInfo({\n          name: col.name,\n          dtype: sqliteTypeToInfermap(col.type),\n          sampleValues,\n          nullRate,\n          uniqueRate,\n          valueCount: total,\n          metadata: { db_type: col.type },\n        })\n      );\n    }\n\n    return makeSchemaInfo({ fields, sourceName: table });\n  } finally {\n    db.close();\n  }\n}\n\n// ---------- PostgreSQL (pg) ----------\n\nasync function loadPg(): Promise<unknown> {\n  try {\n    return await import(/* @vite-ignore */ \"pg\" as string);\n  } catch {\n    throw new DbError(\n      \"pg is required for PostgreSQL. Install it: npm install pg\"\n    );\n  }\n}\n\nasync function extractPostgres(\n  conn: Extract<ConnInfo, { driver: \"postgresql\" }>,\n  table: string,\n  sampleSize: number\n): Promise<SchemaInfo> {\n  const pg = await loadPg();\n  const ClientCtor = (pg as { Client: new (cfg: object) => unknown }).Client;\n  type PgClient = {\n    connect(): Promise<void>;\n    query<T = unknown>(\n      text: string,\n      values?: unknown[]\n    ): Promise<{ rows: T[] }>;\n    end(): Promise<void>;\n  };\n  const client = new ClientCtor({\n    host: conn.host,\n    port: conn.port,\n    user: conn.user,\n    password: conn.password,\n    database: conn.database,\n  }) as PgClient;\n\n  try {\n    await client.connect();\n  } catch (e) {\n    throw new DbError(\n      `Cannot connect to PostgreSQL at ${conn.host}:${conn.port}: ${String(e)}`\n    );\n  }\n\n  try {\n    const cols = await client.query<{\n      column_name: string;\n      data_type: string;\n    }>(\n      `SELECT column_name, data_type\n       FROM information_schema.columns\n       WHERE table_name = $1\n       ORDER BY ordinal_position`,\n      [table]\n    );\n    if (cols.rows.length === 0) {\n      throw new DbError(`Table '${table}' not found or has no columns`);\n    }\n\n    const quoted = `\"${table.replace(/\"/g, '\"\"')}\"`;\n    const totalRes = await client.query<{ count: string }>(\n      `SELECT COUNT(*)::text AS count FROM ${quoted}`\n    );\n    const total = Number(totalRes.rows[0]!.count);\n\n    const sampleRes = await client.query<Record<string, unknown>>(\n      `SELECT * FROM ${quoted} LIMIT $1`,\n      [sampleSize]\n    );\n    const sampleRows = sampleRes.rows;\n\n    const fields: FieldInfo[] = cols.rows.map((col) => {\n      const rawSamples: unknown[] = [];\n      let nulls = 0;\n      for (const row of sampleRows) {\n        const v = row[col.column_name];\n        if (v === null || v === undefined) nulls++;\n        else rawSamples.push(v);\n      }\n      const totalSampled = sampleRows.length;\n      const nullRateRaw = totalSampled > 0 ? nulls / totalSampled : 0;\n      const nullRate = Math.round(nullRateRaw * 10000) / 10000;\n\n      const uniqueStrings = new Set(rawSamples.map((v) => String(v)));\n      const uniqueRateRaw =\n        rawSamples.length > 0 ? uniqueStrings.size / rawSamples.length : 0;\n      const uniqueRate = Math.round(uniqueRateRaw * 10000) / 10000;\n\n      return makeFieldInfo({\n        name: col.column_name,\n        dtype: pgTypeToInfermap(col.data_type),\n        sampleValues: rawSamples.slice(0, sampleSize).map((v) => String(v)),\n        nullRate,\n        uniqueRate,\n        // Match the Python quirk: value_count = total - int(null_rate * total)\n        valueCount: total - Math.trunc(nullRate * total),\n        metadata: { db_type: col.data_type },\n      });\n    });\n\n    return makeSchemaInfo({\n      fields,\n      sourceName: `${conn.database}.${table}`,\n    });\n  } finally {\n    await client.end();\n  }\n}\n\n// ---------- DuckDB (@duckdb/node-api) ----------\n\nasync function loadDuckdb(): Promise<unknown> {\n  try {\n    return await import(/* @vite-ignore */ \"@duckdb/node-api\" as string);\n  } catch {\n    throw new DbError(\n      \"@duckdb/node-api is required for DuckDB. Install it: npm install @duckdb/node-api\"\n    );\n  }\n}\n\nasync function extractDuckdb(\n  path: string,\n  table: string,\n  sampleSize: number\n): Promise<SchemaInfo> {\n  const duckdb = await loadDuckdb();\n  type DuckInstance = {\n    connect(): Promise<DuckConnection>;\n    closeSync?(): void;\n  };\n  type DuckConnection = {\n    runAndReadAll(sql: string, params?: unknown[]): Promise<{\n      getRows(): unknown[][];\n      getRowObjects(): Array<Record<string, unknown>>;\n    }>;\n    closeSync?(): void;\n  };\n  const api = duckdb as {\n    DuckDBInstance: { create(path: string): Promise<DuckInstance> };\n  };\n\n  const dbPath = path || \":memory:\";\n  const instance = await api.DuckDBInstance.create(dbPath);\n  const conn = await instance.connect();\n\n  try {\n    const colsReader = await conn.runAndReadAll(\n      `SELECT column_name, data_type FROM information_schema.columns\n       WHERE table_name = ? ORDER BY ordinal_position`,\n      [table]\n    );\n    const cols = colsReader.getRowObjects() as Array<{\n      column_name: string;\n      data_type: string;\n    }>;\n    if (cols.length === 0) {\n      throw new DbError(`Table '${table}' not found in DuckDB: ${dbPath}`);\n    }\n\n    const quoted = `\"${table.replace(/\"/g, '\"\"')}\"`;\n    const totalReader = await conn.runAndReadAll(\n      `SELECT COUNT(*)::BIGINT AS c FROM ${quoted}`\n    );\n    const totalRow = totalReader.getRowObjects()[0] as { c: bigint | number };\n    const total = Number(totalRow.c);\n\n    const sampleReader = await conn.runAndReadAll(\n      `SELECT * FROM ${quoted} USING SAMPLE ${sampleSize}`\n    );\n    const sampleRows = sampleReader.getRowObjects() as Array<\n      Record<string, unknown>\n    >;\n\n    const fields: FieldInfo[] = cols.map((col) => {\n      const rawSamples: unknown[] = [];\n      let nulls = 0;\n      for (const row of sampleRows) {\n        const v = row[col.column_name];\n        if (v === null || v === undefined) nulls++;\n        else rawSamples.push(v);\n      }\n      const totalSampled = sampleRows.length;\n      const nullRateRaw = totalSampled > 0 ? nulls / totalSampled : 0;\n      const nullRate = Math.round(nullRateRaw * 10000) / 10000;\n\n      const uniqueStrings = new Set(rawSamples.map((v) => String(v)));\n      const uniqueRateRaw =\n        rawSamples.length > 0 ? uniqueStrings.size / rawSamples.length : 0;\n      const uniqueRate = Math.round(uniqueRateRaw * 10000) / 10000;\n\n      return makeFieldInfo({\n        name: col.column_name,\n        dtype: duckdbTypeToInfermap(col.data_type),\n        sampleValues: rawSamples.slice(0, sampleSize).map((v) => String(v)),\n        nullRate,\n        uniqueRate,\n        valueCount: total - Math.trunc(nullRate * total),\n        metadata: { db_type: col.data_type },\n      });\n    });\n\n    return makeSchemaInfo({\n      fields,\n      sourceName: `${dbPath}:${table}`,\n    });\n  } finally {\n    if (conn.closeSync) conn.closeSync();\n    if (instance.closeSync) instance.closeSync();\n  }\n}\n","/**\n * InferMap -> Identity Graph bridge (node-only).\n *\n * Helper that writes InferMap's schema-mapping output into the GoldenMatch\n * Identity Graph as `IdentityAlias` rows. When InferMap discovers that\n * `crm.cust_id` maps to `customer_id` (the canonical entity-id field on the\n * target schema), each source record's `crm.cust_id` value becomes an alias\n * that resolves to that record's identity.\n *\n * This is **per-record** alias writing -- InferMap tells us *which column\n * holds the id of this kind*, we record one row per (record, alias-kind).\n * Schema-level \"this column maps to that column\" aliasing without a record\n * context is intentionally **not** modeled -- the alias table is keyed on the\n * alias *value*, not the column name.\n *\n * Node-only: callers pass a goldenmatch Identity Graph `IdentityStore`. The\n * edge-safe core never imports this module. To keep the published package free\n * of a goldenmatch runtime dependency, the store/alias shapes are modelled by\n * the local {@link AliasStore} / {@link IdentityAliasRow} structural\n * interfaces; a real goldenmatch `IdentityStore` satisfies `AliasStore`.\n *\n * TS parity with `packages/python/infermap/infermap/identity.py`. The Python\n * sibling lazily imports `goldenmatch.identity`; here the caller supplies the\n * store, so there is no import to fail. `store.addAlias` may be async, so this\n * function is async too and the `entityIdResolver` may return a value or a\n * Promise.\n *\n * See issue #206 for the design discussion.\n */\n\nimport type { MapResult } from \"../core/types.js\";\n\n/**\n * Minimal structural shape of a goldenmatch `IdentityAlias` row. Declared\n * locally so the *published* infermap package takes no dependency on\n * goldenmatch — callers pass a real goldenmatch `IdentityStore`, which is\n * structurally compatible. (The integration test exercises the real store\n * via a dev-only dependency.)\n */\nexport interface IdentityAliasRow {\n  alias: string;\n  entityId: string;\n  kind: string;\n  dataset?: string | null;\n  recordedAt?: Date;\n}\n\n/**\n * Minimal structural shape of a goldenmatch `IdentityStore`. Only `addAlias`\n * is used by this bridge; a real `IdentityStore` satisfies it.\n */\nexport interface AliasStore {\n  addAlias(alias: IdentityAliasRow): unknown | Promise<unknown>;\n}\n\n/** Summary of one `writeAliasesFromMapping` invocation. */\nexport interface AliasWriteResult {\n  aliasesWritten: number;\n  recordsProcessed: number;\n  mappingsUsed: number;\n  skippedLowConfidence: number;\n  skippedNoValue: number;\n  skippedNoEntity: number;\n  skippedNoKind: number;\n}\n\n/** Serialize an AliasWriteResult to the Python `as_dict()` snake_case shape. */\nexport function aliasWriteResultAsDict(\n  r: AliasWriteResult,\n): Record<string, number> {\n  return {\n    aliases_written: r.aliasesWritten,\n    records_processed: r.recordsProcessed,\n    mappings_used: r.mappingsUsed,\n    skipped_low_confidence: r.skippedLowConfidence,\n    skipped_no_value: r.skippedNoValue,\n    skipped_no_entity: r.skippedNoEntity,\n    skipped_no_kind: r.skippedNoKind,\n  };\n}\n\n/**\n * Target field names that count as alias-kinds by default. Mirrors the Python\n * `alias_kinds` default. Pass an extended set when your target schema has\n * domain-specific ids (e.g. `\"npi\"` for healthcare).\n */\nexport const DEFAULT_ALIAS_KINDS: ReadonlySet<string> = new Set([\n  \"customer_id\",\n  \"user_id\",\n  \"account_id\",\n  \"external_id\",\n  \"email\",\n  \"phone\",\n  \"ssn\",\n  \"tax_id\",\n  \"ein\",\n  \"vin\",\n  \"isbn\",\n  \"doi\",\n]);\n\n/** Default minimum confidence -- matches InferMap's \"strong match\" threshold. */\nexport const DEFAULT_MIN_CONFIDENCE = 0.85;\n\n/**\n * Return the alias `kind` for a target field name, or null. Strict\n * case-insensitive match against `aliasKinds`. Mirrors Python `_is_alias_kind`.\n */\nfunction isAliasKind(\n  targetField: string,\n  aliasKinds: ReadonlySet<string>,\n): string | null {\n  const norm = targetField.toLowerCase().trim();\n  return aliasKinds.has(norm) ? norm : null;\n}\n\nexport type EntityIdResolver = (\n  record: Record<string, unknown>,\n) => string | null | undefined | Promise<string | null | undefined>;\n\nexport interface WriteAliasesOptions {\n  /** Source name (e.g. `\"crm\"`). Namespaces the alias value (`source:value`). */\n  sourceName: string;\n  /**\n   * Target field names that count as alias-kinds. Defaults to\n   * {@link DEFAULT_ALIAS_KINDS}.\n   */\n  aliasKinds?: ReadonlySet<string> | Iterable<string>;\n  /** Drop any mapping below this confidence. Defaults to 0.85. */\n  minConfidence?: number;\n  /** Optional dataset name flowed onto each `IdentityAlias` row. */\n  dataset?: string | null;\n  /**\n   * Logger invoked when a single `addAlias` call throws. Defaults to\n   * `console.warn`. A bad row never aborts the batch (identity is additive).\n   */\n  onError?: (info: {\n    alias: string;\n    kind: string;\n    entityId: string;\n    error: unknown;\n  }) => void;\n}\n\n/**\n * Write `IdentityAlias` rows for each record where InferMap mapped a source\n * column to a known alias-kind target column.\n *\n * @param mapping InferMap's `MapResult` (e.g. from `map(source, target)`).\n * @param records Iterable of source records (dicts keyed by source field name).\n * @param store A goldenmatch `IdentityStore` instance.\n * @param entityIdResolver `record -> entityId | null` (may be async). Returning\n *   null/undefined skips alias writing for that row.\n * @param options See {@link WriteAliasesOptions}; `sourceName` is required.\n */\nexport async function writeAliasesFromMapping(\n  mapping: MapResult,\n  records: Iterable<Record<string, unknown>>,\n  store: AliasStore,\n  entityIdResolver: EntityIdResolver,\n  options: WriteAliasesOptions,\n): Promise<AliasWriteResult> {\n  if (store === null || store === undefined || typeof store.addAlias !== \"function\") {\n    throw new Error(\n      \"writeAliasesFromMapping requires a goldenmatch IdentityStore \" +\n        \"(an object exposing addAlias).\",\n    );\n  }\n\n  const {\n    sourceName,\n    minConfidence = DEFAULT_MIN_CONFIDENCE,\n    dataset = null,\n  } = options;\n  const aliasKinds: ReadonlySet<string> =\n    options.aliasKinds === undefined\n      ? DEFAULT_ALIAS_KINDS\n      : options.aliasKinds instanceof Set\n        ? (options.aliasKinds as ReadonlySet<string>)\n        : new Set(options.aliasKinds);\n  const onError =\n    options.onError ??\n    (({ alias, kind, entityId, error }) => {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Failed to write alias ${alias} (kind=${kind}) for entity ${entityId}: ${String(error)}`,\n      );\n    });\n\n  // Pre-compute the usable (sourceCol, targetKind) tuples. Drops\n  // low-confidence and non-alias-kind mappings upfront so we don't reread\n  // per record.\n  const usable: Array<[string, string]> = [];\n  let skippedLowConfidence = 0;\n  for (const m of mapping.mappings) {\n    if (m.confidence < minConfidence) {\n      skippedLowConfidence += 1;\n      continue;\n    }\n    const kind = isAliasKind(m.target, aliasKinds);\n    if (kind === null) continue;\n    usable.push([m.source, kind]);\n  }\n\n  const summary: AliasWriteResult = {\n    aliasesWritten: 0,\n    recordsProcessed: 0,\n    mappingsUsed: usable.length,\n    skippedLowConfidence,\n    skippedNoValue: 0,\n    skippedNoEntity: 0,\n    skippedNoKind: 0,\n  };\n\n  if (usable.length === 0) {\n    return summary;\n  }\n\n  for (const record of records) {\n    summary.recordsProcessed += 1;\n    const entityId = await entityIdResolver(record);\n    if (entityId === null || entityId === undefined) {\n      summary.skippedNoEntity += 1;\n      continue;\n    }\n\n    for (const [sourceCol, kind] of usable) {\n      const value = record[sourceCol];\n      if (value === null || value === undefined || value === \"\") {\n        summary.skippedNoValue += 1;\n        continue;\n      }\n      const aliasValue = `${sourceName}:${value}`;\n      const aliasRow: IdentityAliasRow = {\n        alias: aliasValue,\n        entityId,\n        kind,\n        dataset,\n        recordedAt: new Date(),\n      };\n      try {\n        await store.addAlias(aliasRow);\n        summary.aliasesWritten += 1;\n      } catch (error) {\n        // Don't blow up the whole batch on one bad row -- log and continue.\n        // Identity is additive; partial writes are fine.\n        onError({ alias: aliasValue, kind, entityId, error });\n      }\n    }\n  }\n\n  return summary;\n}\n"]}