@walkthru-earth/objex-utils 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -0
- package/dist/index.cjs +1183 -954
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +167 -1
- package/dist/index.d.ts +167 -1
- package/dist/index.js +1161 -955
- package/dist/index.js.map +1 -1
- package/package.json +8 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/constants.ts","../../../src/lib/file-icons/index.ts","../../../src/lib/query/engine.ts","../../../src/lib/storage/url-adapter.ts","../../../src/lib/utils/column-types.ts","../../../src/lib/utils/error.ts","../../../src/lib/utils/format.ts","../../../src/lib/utils/geoarrow.ts","../../../src/lib/utils/hex.ts","../../../src/lib/utils/parquet-metadata.ts","../../../src/lib/storage/providers.ts","../../../src/lib/utils/storage-url.ts","../../../src/lib/utils/wkb.ts"],"names":["ext","globalBounds"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared constants used across the application.\n * Centralizes magic strings, numbers, and sets to prevent duplication.\n */\n\n// ── localStorage keys ──\n\nexport const STORAGE_KEYS = {\n\tSETTINGS: 'obstore-explore-settings',\n\tCONNECTIONS: 'obstore-explore-connections',\n\tQUERY_HISTORY: 'obstore-explore-query-history'\n} as const;\n\n// ── Geo / CRS constants ──\n\n/** EPSG codes considered WGS84 (no reprojection needed). */\nexport const WGS84_CODES = new Set([4326, 4979]);\n\n/** Default target CRS for ST_Transform. */\nexport const DEFAULT_TARGET_CRS = 'EPSG:4326';\n\n// ── Query engine constants ──\n\n/** DuckDB-WASM initialization timeout in ms. */\nexport const DUCKDB_INIT_TIMEOUT_MS = 30_000;\n\n/** Maximum entries kept in query history. */\nexport const MAX_QUERY_HISTORY_ENTRIES = 200;\n\n/** SQL preview truncation length (characters). */\nexport const SQL_PREVIEW_LENGTH = 120;\n\n// ── File browser constants ──\n\n/** Extensions that represent \"virtual files\" — directories that open as viewers. */\nexport const VIEWER_DIR_EXTENSIONS = new Set(['zarr', 'zr3']);\n\n// ── PMTiles ──\n\n/**\n * Golden-angle-based hue multiplier for evenly distributing layer colors.\n * 137 ≈ 360 × (1 − 1/φ) where φ is the golden ratio.\n */\nexport const LAYER_HUE_MULTIPLIER = 137;\n\n// ── Clipboard ──\n\n/** Duration (ms) to show \"Copied!\" feedback before resetting. */\nexport const COPY_FEEDBACK_MS = 2000;\n","/**\n * Centralized file type detection module.\n *\n * Single source of truth for extension → icon, color, label, category,\n * viewer, DuckDB read function, MIME type, and queryability.\n *\n * Used by: FileRow, FileTreeSidebar, ViewerRouter, TableViewer, WasmQueryEngine, etc.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type FileCategory =\n\t| 'data'\n\t| 'geo'\n\t| 'code'\n\t| 'document'\n\t| 'config'\n\t| 'image'\n\t| 'video'\n\t| 'audio'\n\t| 'archive'\n\t| 'database'\n\t| '3d'\n\t| 'other';\n\nexport type ViewerKind =\n\t| 'table'\n\t| 'image'\n\t| 'video'\n\t| 'audio'\n\t| 'markdown'\n\t| 'code'\n\t| 'cog'\n\t| 'pmtiles'\n\t| 'flatgeobuf'\n\t| 'pdf'\n\t| '3d'\n\t| 'archive'\n\t| 'database'\n\t| 'zarr'\n\t| 'copc'\n\t| 'notebook'\n\t| 'raw';\n\nexport type DuckDbReadFn = 'read_parquet' | 'read_csv' | 'read_json' | 'ST_Read';\n\nexport interface FileTypeInfo {\n\t/** Lucide icon name */\n\ticon: string;\n\t/** Tailwind color classes (light + dark) */\n\tcolor: string;\n\t/** Human-readable type label, e.g. \"Apache Parquet\" */\n\tlabel: string;\n\t/** High-level category */\n\tcategory: FileCategory;\n\t/** Which viewer component to use */\n\tviewer: ViewerKind;\n\t/** Whether this file can be queried with DuckDB */\n\tqueryable: boolean;\n\t/** DuckDB read function (null if not queryable) */\n\tduckdbReadFn: DuckDbReadFn | null;\n\t/** MIME type */\n\tmimeType: string;\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_INFO: FileTypeInfo = {\n\ticon: 'File',\n\tcolor: 'text-zinc-400 dark:text-zinc-500',\n\tlabel: 'File',\n\tcategory: 'other',\n\tviewer: 'raw',\n\tqueryable: false,\n\tduckdbReadFn: null,\n\tmimeType: 'application/octet-stream'\n};\n\nconst FOLDER_INFO: FileTypeInfo = {\n\ticon: 'Folder',\n\tcolor: 'text-blue-500 dark:text-blue-400',\n\tlabel: 'Folder',\n\tcategory: 'other',\n\tviewer: 'raw',\n\tqueryable: false,\n\tduckdbReadFn: null,\n\tmimeType: 'inode/directory'\n};\n\n// ---------------------------------------------------------------------------\n// Extension registry\n// ---------------------------------------------------------------------------\n\nconst EXTENSIONS: Record<string, FileTypeInfo> = {\n\t// ── Data / Tabular ──────────────────────────────────────────────────\n\t'.parquet': {\n\t\ticon: 'Columns3',\n\t\tcolor: 'text-purple-600 dark:text-purple-400',\n\t\tlabel: 'Apache Parquet',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_parquet',\n\t\tmimeType: 'application/vnd.apache.parquet'\n\t},\n\t'.geoparquet': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'GeoParquet',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_parquet',\n\t\tmimeType: 'application/vnd.apache.parquet'\n\t},\n\t'.gpq': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'GeoParquet',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_parquet',\n\t\tmimeType: 'application/vnd.apache.parquet'\n\t},\n\t'.gparquet': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'GeoParquet',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_parquet',\n\t\tmimeType: 'application/vnd.apache.parquet'\n\t},\n\t'.csv': {\n\t\ticon: 'Table',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'CSV',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_csv',\n\t\tmimeType: 'text/csv'\n\t},\n\t'.tsv': {\n\t\ticon: 'Table',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'TSV',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_csv',\n\t\tmimeType: 'text/tab-separated-values'\n\t},\n\t'.json': {\n\t\ticon: 'Braces',\n\t\tcolor: 'text-yellow-600 dark:text-yellow-400',\n\t\tlabel: 'JSON',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/json'\n\t},\n\t'.jsonl': {\n\t\ticon: 'Braces',\n\t\tcolor: 'text-yellow-500 dark:text-yellow-400',\n\t\tlabel: 'JSON Lines',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_json',\n\t\tmimeType: 'application/x-jsonlines'\n\t},\n\t'.ndjson': {\n\t\ticon: 'Braces',\n\t\tcolor: 'text-yellow-500 dark:text-yellow-400',\n\t\tlabel: 'NDJSON',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_json',\n\t\tmimeType: 'application/x-ndjson'\n\t},\n\t'.geojson': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-emerald-600 dark:text-emerald-400',\n\t\tlabel: 'GeoJSON',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_json',\n\t\tmimeType: 'application/geo+json'\n\t},\n\t'.arrow': {\n\t\ticon: 'Zap',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'Apache Arrow',\n\t\tcategory: 'data',\n\t\tviewer: 'raw',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/vnd.apache.arrow.file'\n\t},\n\t'.feather': {\n\t\ticon: 'Zap',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'Feather',\n\t\tcategory: 'data',\n\t\tviewer: 'raw',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/vnd.apache.arrow.file'\n\t},\n\t'.ipc': {\n\t\ticon: 'Zap',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'Arrow IPC',\n\t\tcategory: 'data',\n\t\tviewer: 'raw',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/vnd.apache.arrow.stream'\n\t},\n\n\t// ── Images ──────────────────────────────────────────────────────────\n\t'.png': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'PNG Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/png'\n\t},\n\t'.jpg': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'JPEG Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/jpeg'\n\t},\n\t'.jpeg': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'JPEG Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/jpeg'\n\t},\n\t'.gif': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'GIF Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/gif'\n\t},\n\t'.webp': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'WebP Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/webp'\n\t},\n\t'.avif': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'AVIF Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/avif'\n\t},\n\t'.svg': {\n\t\ticon: 'Palette',\n\t\tcolor: 'text-pink-600 dark:text-pink-400',\n\t\tlabel: 'SVG',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/svg+xml'\n\t},\n\t'.bmp': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'BMP Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/bmp'\n\t},\n\t'.ico': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'Icon',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/x-icon'\n\t},\n\n\t// ── Video ───────────────────────────────────────────────────────────\n\t'.mp4': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'MP4 Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/mp4'\n\t},\n\t'.webm': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'WebM Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/webm'\n\t},\n\t'.mov': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'MOV Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/quicktime'\n\t},\n\t'.avi': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'AVI Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/x-msvideo'\n\t},\n\t'.mkv': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'MKV Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/x-matroska'\n\t},\n\n\t// ── Audio ───────────────────────────────────────────────────────────\n\t'.mp3': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'MP3 Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/mpeg'\n\t},\n\t'.wav': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'WAV Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/wav'\n\t},\n\t'.ogg': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'OGG Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/ogg'\n\t},\n\t'.flac': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'FLAC Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/flac'\n\t},\n\t'.aac': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'AAC Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/aac'\n\t},\n\n\t// ── Code ────────────────────────────────────────────────────────────\n\t'.py': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-sky-600 dark:text-sky-400',\n\t\tlabel: 'Python',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-python'\n\t},\n\t'.ts': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-600 dark:text-blue-400',\n\t\tlabel: 'TypeScript',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/typescript'\n\t},\n\t'.js': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-yellow-500 dark:text-yellow-400',\n\t\tlabel: 'JavaScript',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/javascript'\n\t},\n\t'.rs': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-orange-700 dark:text-orange-400',\n\t\tlabel: 'Rust',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-rust'\n\t},\n\t'.go': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-cyan-600 dark:text-cyan-400',\n\t\tlabel: 'Go',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-go'\n\t},\n\t'.java': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-red-600 dark:text-red-400',\n\t\tlabel: 'Java',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-java'\n\t},\n\t'.c': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'C',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-c'\n\t},\n\t'.cpp': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'C++',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-c++'\n\t},\n\t'.h': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'C Header',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-c'\n\t},\n\t'.hpp': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'C++ Header',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-c++'\n\t},\n\t'.rb': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-red-500 dark:text-red-400',\n\t\tlabel: 'Ruby',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-ruby'\n\t},\n\t'.php': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-indigo-500 dark:text-indigo-400',\n\t\tlabel: 'PHP',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-php'\n\t},\n\t'.swift': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'Swift',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-swift'\n\t},\n\t'.kt': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'Kotlin',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-kotlin'\n\t},\n\t'.scala': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-red-600 dark:text-red-400',\n\t\tlabel: 'Scala',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-scala'\n\t},\n\t'.r': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-600 dark:text-blue-400',\n\t\tlabel: 'R',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-r'\n\t},\n\t'.lua': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-800 dark:text-blue-400',\n\t\tlabel: 'Lua',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-lua'\n\t},\n\t'.html': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-orange-600 dark:text-orange-400',\n\t\tlabel: 'HTML',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/html'\n\t},\n\t'.css': {\n\t\ticon: 'Paintbrush',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'CSS',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/css'\n\t},\n\t'.sql': {\n\t\ticon: 'DatabaseZap',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'SQL',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-sql'\n\t},\n\t'.sh': {\n\t\ticon: 'Terminal',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'Shell Script',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-shellscript'\n\t},\n\t'.bash': {\n\t\ticon: 'Terminal',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'Bash Script',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-shellscript'\n\t},\n\t'.vim': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-green-700 dark:text-green-400',\n\t\tlabel: 'Vim Script',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.dockerfile': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-600 dark:text-blue-400',\n\t\tlabel: 'Dockerfile',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.makefile': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-orange-600 dark:text-orange-400',\n\t\tlabel: 'Makefile',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\n\t// ── Documents ───────────────────────────────────────────────────────\n\t'.md': {\n\t\ticon: 'BookText',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'Markdown',\n\t\tcategory: 'document',\n\t\tviewer: 'markdown',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/markdown'\n\t},\n\t'.markdown': {\n\t\ticon: 'BookText',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'Markdown',\n\t\tcategory: 'document',\n\t\tviewer: 'markdown',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/markdown'\n\t},\n\t'.pdf': {\n\t\ticon: 'FileText',\n\t\tcolor: 'text-red-600 dark:text-red-400',\n\t\tlabel: 'PDF',\n\t\tcategory: 'document',\n\t\tviewer: 'pdf',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/pdf'\n\t},\n\t'.txt': {\n\t\ticon: 'FileText',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Text',\n\t\tcategory: 'document',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.log': {\n\t\ticon: 'FileText',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Log File',\n\t\tcategory: 'document',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\n\t// ── Config ──────────────────────────────────────────────────────────\n\t'.xml': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'XML',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/xml'\n\t},\n\t'.yaml': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'YAML',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/yaml'\n\t},\n\t'.yml': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'YAML',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/yaml'\n\t},\n\t'.toml': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'TOML',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.ini': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'INI',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.cfg': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Config',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.conf': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Config',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.env': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Environment',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\n\t// ── Archives ────────────────────────────────────────────────────────\n\t'.zip': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'ZIP Archive',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/zip'\n\t},\n\t'.tar': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'TAR Archive',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-tar'\n\t},\n\t'.gz': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'GZIP',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/gzip'\n\t},\n\t'.tgz': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'TGZ Archive',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/gzip'\n\t},\n\t'.7z': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: '7-Zip',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-7z-compressed'\n\t},\n\t'.rar': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'RAR',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/vnd.rar'\n\t},\n\t'.bz2': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'BZIP2',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-bzip2'\n\t},\n\n\t// ── Geo / Map ───────────────────────────────────────────────────────\n\t'.tif': {\n\t\ticon: 'Map',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'GeoTIFF',\n\t\tcategory: 'geo',\n\t\tviewer: 'cog',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/tiff'\n\t},\n\t'.tiff': {\n\t\ticon: 'Map',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'GeoTIFF',\n\t\tcategory: 'geo',\n\t\tviewer: 'cog',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/tiff'\n\t},\n\t'.pmtiles': {\n\t\ticon: 'Layers',\n\t\tcolor: 'text-teal-600 dark:text-teal-400',\n\t\tlabel: 'PMTiles',\n\t\tcategory: 'geo',\n\t\tviewer: 'pmtiles',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.fgb': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-teal-500 dark:text-teal-400',\n\t\tlabel: 'FlatGeobuf',\n\t\tcategory: 'geo',\n\t\tviewer: 'flatgeobuf',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.shp': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'Shapefile',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'ST_Read',\n\t\tmimeType: 'application/x-esri-shape'\n\t},\n\t'.gpkg': {\n\t\ticon: 'Database',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'GeoPackage',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'ST_Read',\n\t\tmimeType: 'application/geopackage+sqlite3'\n\t},\n\n\t// ── Database ────────────────────────────────────────────────────────\n\t'.duckdb': {\n\t\ticon: 'Database',\n\t\tcolor: 'text-yellow-600 dark:text-yellow-400',\n\t\tlabel: 'DuckDB',\n\t\tcategory: 'database',\n\t\tviewer: 'database',\n\t\tqueryable: true,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.sqlite': {\n\t\ticon: 'Database',\n\t\tcolor: 'text-sky-600 dark:text-sky-400',\n\t\tlabel: 'SQLite',\n\t\tcategory: 'database',\n\t\tviewer: 'database',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-sqlite3'\n\t},\n\t'.db': {\n\t\ticon: 'Database',\n\t\tcolor: 'text-amber-500 dark:text-amber-400',\n\t\tlabel: 'Database',\n\t\tcategory: 'database',\n\t\tviewer: 'database',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\n\t// ── 3D Models ───────────────────────────────────────────────────────\n\t'.glb': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'GLB Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'model/gltf-binary'\n\t},\n\t'.gltf': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'glTF Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'model/gltf+json'\n\t},\n\t'.obj': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'OBJ Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.stl': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'STL Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'model/stl'\n\t},\n\t'.fbx': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'FBX Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\n\t// ── Notebooks ───────────────────────────────────────────────────────\n\t'.ipynb': {\n\t\ticon: 'BookOpen',\n\t\tcolor: 'text-orange-600 dark:text-orange-400',\n\t\tlabel: 'Jupyter Notebook',\n\t\tcategory: 'code',\n\t\tviewer: 'notebook',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-ipynb+json'\n\t},\n\n\t// ── Special ─────────────────────────────────────────────────────────\n\t'.zarr': {\n\t\ticon: 'Layers',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'Zarr',\n\t\tcategory: 'data',\n\t\tviewer: 'zarr',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.zr3': {\n\t\ticon: 'Layers',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'Zarr',\n\t\tcategory: 'data',\n\t\tviewer: 'zarr',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\n\t// ── Point Cloud ─────────────────────────────────────────────────────\n\t'.laz': {\n\t\ticon: 'Orbit',\n\t\tcolor: 'text-cyan-600 dark:text-cyan-400',\n\t\tlabel: 'COPC / LAZ',\n\t\tcategory: 'geo',\n\t\tviewer: 'copc',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.las': {\n\t\ticon: 'Orbit',\n\t\tcolor: 'text-cyan-600 dark:text-cyan-400',\n\t\tlabel: 'LAS Point Cloud',\n\t\tcategory: 'geo',\n\t\tviewer: 'copc',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t}\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Returns full file type information for a given extension.\n * Extension may be with or without leading dot: \".parquet\" or \"parquet\".\n */\nexport function getFileTypeInfo(extension: string, isDir = false): FileTypeInfo {\n\tif (isDir && extension) {\n\t\tconst ext = extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n\t\tconst found = EXTENSIONS[ext];\n\t\tif (found) return found;\n\t}\n\tif (isDir) return FOLDER_INFO;\n\tconst ext = extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n\treturn EXTENSIONS[ext] ?? DEFAULT_INFO;\n}\n\n/** Returns the DuckDB read function name for a file path. Falls back to read_parquet. */\nexport function getDuckDbReadFn(pathOrExt: string): string {\n\tconst ext = pathOrExt.includes('.') ? `.${pathOrExt.split('.').pop()!.toLowerCase()}` : '';\n\treturn EXTENSIONS[ext]?.duckdbReadFn ?? 'read_parquet';\n}\n\n/**\n * Returns a DuckDB FROM-clause expression for a file.\n *\n * For GeoJSON files the raw `read_json_auto` returns a single row with the\n * FeatureCollection structure (`type`, `features`, `bbox`). This helper\n * unnests the features array so each feature becomes its own row with\n * property columns + a geometry column.\n */\nexport function buildDuckDbSource(pathOrExt: string, url: string): string {\n\tconst ext = pathOrExt.includes('.') ? `.${pathOrExt.split('.').pop()!.toLowerCase()}` : '';\n\tif (ext === '.geojson') {\n\t\treturn `(SELECT unnest(feature.properties), to_json(feature.geometry)::VARCHAR AS geometry FROM (SELECT unnest(features) AS feature FROM read_json_auto('${url}', maximum_object_size=1073741824, ignore_errors=true)))`;\n\t}\n\tconst readFn = EXTENSIONS[ext]?.duckdbReadFn ?? 'read_parquet';\n\treturn `${readFn}('${url}')`;\n}\n\n/**\n * Cloud-native formats that DuckDB can query via range requests — metadata\n * reads (schema, row count) are cheap and don't download the full file.\n *\n * Other cloud-native formats (.fgb, .pmtiles, .zarr) also support range\n * requests but have dedicated viewers and don't go through DuckDB/TableViewer.\n */\nconst CLOUD_NATIVE_EXTS = new Set(['.parquet', '.geoparquet', '.gpq', '.gparquet']);\n\nexport function isCloudNativeFormat(pathOrExt: string): boolean {\n\tconst ext = pathOrExt.includes('.') ? `.${pathOrExt.split('.').pop()!.toLowerCase()}` : '';\n\treturn CLOUD_NATIVE_EXTS.has(ext);\n}\n\n/** Returns the viewer kind for a given extension. */\nexport function getViewerKind(extension: string): ViewerKind {\n\treturn getFileTypeInfo(extension).viewer;\n}\n\n/** Returns whether a file can be queried with DuckDB. */\nexport function isQueryable(extension: string): boolean {\n\treturn getFileTypeInfo(extension).queryable;\n}\n\n/** Returns the MIME type for a file extension. */\nexport function getMimeType(extension: string): string {\n\treturn getFileTypeInfo(extension).mimeType;\n}\n\n/** Re-export folder info for components that need it directly. */\nexport { FOLDER_INFO, DEFAULT_INFO };\n","export class QueryCancelledError extends Error {\n\tconstructor() {\n\t\tsuper('Query cancelled');\n\t\tthis.name = 'QueryCancelledError';\n\t}\n}\n\nexport interface QueryHandle {\n\tresult: Promise<QueryResult>;\n\tcancel: () => Promise<boolean>;\n}\n\nexport interface MapQueryHandle {\n\tresult: Promise<MapQueryResult>;\n\tcancel: () => Promise<boolean>;\n}\n\nexport interface QueryResult {\n\tcolumns: string[];\n\ttypes: string[];\n\trowCount: number;\n\t/** Pre-parsed rows — avoids Arrow version mismatch in WASM engine */\n\trows: Record<string, any>[];\n}\n\n/** Raw column data for map rendering (bypasses toJSON serialization). */\nexport interface MapQueryResult {\n\t/** Geometry column as raw WKB binary arrays */\n\twkbArrays: Uint8Array[];\n\t/** Geometry type from ST_GeometryType (e.g., 'POLYGON') */\n\tgeometryType: string;\n\t/** Non-geometry attribute columns: name → JS values */\n\tattributes: Map<string, { values: any[]; type: string }>;\n\t/** Number of rows */\n\trowCount: number;\n}\n\nexport interface SchemaField {\n\tname: string;\n\ttype: string;\n\tnullable: boolean;\n}\n\nexport interface QueryEngine {\n\tquery(connId: string, sql: string): Promise<QueryResult>;\n\tqueryForMap(\n\t\tconnId: string,\n\t\tsql: string,\n\t\tgeomCol: string,\n\t\tgeomColType: string,\n\t\tsourceCrs?: string | null\n\t): Promise<MapQueryResult>;\n\tgetSchema(connId: string, path: string): Promise<SchemaField[]>;\n\tgetRowCount(connId: string, path: string): Promise<number>;\n\t/** Detect CRS from GeoParquet metadata. Returns e.g. 'EPSG:27700' or null if WGS84/unknown. */\n\tdetectCrs(connId: string, path: string, geomCol: string): Promise<string | null>;\n\t/** Combined schema + CRS detection in a single connection (fewer web worker round-trips). */\n\tgetSchemaAndCrs?(\n\t\tconnId: string,\n\t\tpath: string,\n\t\tfindGeoCol: (schema: SchemaField[]) => string | null\n\t): Promise<{ schema: SchemaField[]; geomCol: string | null; crs: string | null }>;\n\tqueryCancellable?(connId: string, sql: string): QueryHandle;\n\tqueryForMapCancellable?(\n\t\tconnId: string,\n\t\tsql: string,\n\t\tgeomCol: string,\n\t\tgeomColType: string,\n\t\tsourceCrs?: string | null\n\t): MapQueryHandle;\n\tforceCancel?(): Promise<void>;\n\treleaseMemory(): Promise<void>;\n\tdispose(): Promise<void>;\n}\n","import type { FileEntry, WriteResult } from '../types.js';\nimport type { StorageAdapter } from './adapter.js';\n\n/**\n * Minimal adapter for direct HTTPS URLs (source: 'url').\n * Only supports read/head — no listing or writing.\n * The `path` parameter is the full HTTPS URL.\n */\nexport class UrlAdapter implements StorageAdapter {\n\treadonly supportsWrite = false;\n\n\tasync read(\n\t\turl: string,\n\t\toffset?: number,\n\t\tlength?: number,\n\t\tsignal?: AbortSignal\n\t): Promise<Uint8Array> {\n\t\tconst headers: Record<string, string> = {};\n\t\tif (offset !== undefined && length !== undefined) {\n\t\t\theaders.Range = `bytes=${offset}-${offset + length - 1}`;\n\t\t} else if (offset !== undefined) {\n\t\t\theaders.Range = `bytes=${offset}-`;\n\t\t}\n\n\t\tconst res = await fetch(url, { headers, signal });\n\t\tif (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\treturn new Uint8Array(await res.arrayBuffer());\n\t}\n\n\tasync head(url: string, signal?: AbortSignal): Promise<FileEntry> {\n\t\tconst res = await fetch(url, { method: 'HEAD', signal });\n\t\tif (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\tconst name = url.split('/').pop()?.split('?')[0] || 'file';\n\t\tconst ext = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n\t\treturn {\n\t\t\tname,\n\t\t\tpath: url,\n\t\t\tis_dir: false,\n\t\t\tsize: Number(res.headers.get('content-length') || 0),\n\t\t\tmodified: new Date(res.headers.get('last-modified') || 0).getTime(),\n\t\t\textension: ext\n\t\t};\n\t}\n\n\tasync list(): Promise<FileEntry[]> {\n\t\treturn [];\n\t}\n\n\tasync put(): Promise<WriteResult> {\n\t\tthrow new Error('Write not supported for direct URL sources');\n\t}\n\n\tasync delete(): Promise<void> {\n\t\tthrow new Error('Delete not supported for direct URL sources');\n\t}\n\n\tasync deletePrefix(): Promise<{ deleted: number }> {\n\t\tthrow new Error('Delete not supported for direct URL sources');\n\t}\n\n\tasync copy(): Promise<WriteResult> {\n\t\tthrow new Error('Copy not supported for direct URL sources');\n\t}\n}\n","export type TypeCategory =\n\t| 'number'\n\t| 'string'\n\t| 'date'\n\t| 'boolean'\n\t| 'geo'\n\t| 'binary'\n\t| 'json'\n\t| 'other';\n\nconst NUMBER_TYPES = [\n\t'TINYINT',\n\t'SMALLINT',\n\t'INTEGER',\n\t'BIGINT',\n\t'HUGEINT',\n\t'UTINYINT',\n\t'USMALLINT',\n\t'UINTEGER',\n\t'UBIGINT',\n\t'FLOAT',\n\t'DOUBLE',\n\t'DECIMAL',\n\t'NUMERIC',\n\t'REAL',\n\t'INT',\n\t'INT1',\n\t'INT2',\n\t'INT4',\n\t'INT8',\n\t'SIGNED',\n\t'SHORT',\n\t'LONG'\n];\n\nconst STRING_TYPES = ['VARCHAR', 'TEXT', 'STRING', 'CHAR', 'BPCHAR', 'NAME', 'UUID', 'ENUM'];\n\nconst DATE_TYPES = [\n\t'DATE',\n\t'TIME',\n\t'TIMESTAMP',\n\t'TIMESTAMP_S',\n\t'TIMESTAMP_MS',\n\t'TIMESTAMP_NS',\n\t'TIMESTAMP WITH TIME ZONE',\n\t'TIMESTAMPTZ',\n\t'INTERVAL',\n\t'TIMESTAMP_TZ'\n];\n\nconst BOOLEAN_TYPES = ['BOOLEAN', 'BOOL', 'LOGICAL'];\n\nconst GEO_TYPES = [\n\t'GEOMETRY',\n\t'POINT',\n\t'LINESTRING',\n\t'POLYGON',\n\t'MULTIPOINT',\n\t'MULTILINESTRING',\n\t'MULTIPOLYGON',\n\t'GEOMETRYCOLLECTION',\n\t'WKB_GEOMETRY'\n];\n\nconst BINARY_TYPES = ['BLOB', 'BYTEA', 'BINARY', 'VARBINARY'];\n\nconst JSON_TYPES = ['JSON', 'JSONB'];\n\nexport function classifyType(duckdbType: string): TypeCategory {\n\tconst upper = duckdbType.toUpperCase().trim();\n\n\t// Handle parameterized types like DECIMAL(18,3), VARCHAR(100)\n\tconst base = upper.replace(/\\(.*\\)/, '').trim();\n\n\tif (NUMBER_TYPES.includes(base)) return 'number';\n\tif (STRING_TYPES.includes(base)) return 'string';\n\tif (DATE_TYPES.includes(base)) return 'date';\n\tif (BOOLEAN_TYPES.includes(base)) return 'boolean';\n\tif (GEO_TYPES.includes(base)) return 'geo';\n\tif (BINARY_TYPES.includes(base)) return 'binary';\n\tif (JSON_TYPES.includes(base)) return 'json';\n\n\t// Compound types\n\tif (base.startsWith('STRUCT') || base.startsWith('MAP') || base.startsWith('UNION'))\n\t\treturn 'json';\n\tif (base.endsWith('[]') || base.startsWith('LIST')) return 'json';\n\n\t// Fallback checks\n\tif (\n\t\tupper.includes('INT') ||\n\t\tupper.includes('FLOAT') ||\n\t\tupper.includes('DOUBLE') ||\n\t\tupper.includes('DECIMAL') ||\n\t\tupper.includes('NUMERIC')\n\t)\n\t\treturn 'number';\n\tif (upper.includes('CHAR') || upper.includes('TEXT') || upper.includes('STRING')) return 'string';\n\tif (upper.includes('TIME') || upper.includes('DATE')) return 'date';\n\tif (upper.includes('BOOL')) return 'boolean';\n\tif (upper.includes('GEOMETRY') || upper.includes('GEO') || upper.includes('WKB')) return 'geo';\n\tif (upper.includes('BLOB') || upper.includes('BINARY')) return 'binary';\n\tif (\n\t\tupper.includes('JSON') ||\n\t\tupper.includes('STRUCT') ||\n\t\tupper.includes('MAP') ||\n\t\tupper.includes('LIST')\n\t)\n\t\treturn 'json';\n\n\treturn 'other';\n}\n\nconst TYPE_COLORS: Record<TypeCategory, string> = {\n\tnumber: 'text-blue-500',\n\tstring: 'text-green-500',\n\tdate: 'text-amber-500',\n\tboolean: 'text-purple-500',\n\tgeo: 'text-teal-500',\n\tbinary: 'text-zinc-500',\n\tjson: 'text-orange-500',\n\tother: 'text-zinc-400'\n};\n\nconst TYPE_BADGE_CLASSES: Record<TypeCategory, string> = {\n\tnumber: 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/20',\n\tstring: 'bg-green-500/10 text-green-600 dark:text-green-400 border-green-500/20',\n\tdate: 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/20',\n\tboolean: 'bg-purple-500/10 text-purple-600 dark:text-purple-400 border-purple-500/20',\n\tgeo: 'bg-teal-500/10 text-teal-600 dark:text-teal-400 border-teal-500/20',\n\tbinary: 'bg-zinc-500/10 text-zinc-600 dark:text-zinc-400 border-zinc-500/20',\n\tjson: 'bg-orange-500/10 text-orange-600 dark:text-orange-400 border-orange-500/20',\n\tother: 'bg-zinc-500/10 text-zinc-500 dark:text-zinc-400 border-zinc-500/20'\n};\n\nconst TYPE_LABELS: Record<TypeCategory, string> = {\n\tnumber: '#',\n\tstring: 'Aa',\n\tdate: 'dt',\n\tboolean: 'T/F',\n\tgeo: 'geo',\n\tbinary: '01',\n\tjson: '{}',\n\tother: '?'\n};\n\nexport function typeColor(category: TypeCategory): string {\n\treturn TYPE_COLORS[category];\n}\n\nexport function typeBadgeClass(category: TypeCategory): string {\n\treturn TYPE_BADGE_CLASSES[category];\n}\n\nexport function typeLabel(category: TypeCategory): string {\n\treturn TYPE_LABELS[category];\n}\n","/**\n * Shared error handling for async viewer load operations.\n */\n\n/**\n * Extract an error message from an unknown caught value.\n * Returns null for AbortError (caller should silently return).\n */\nexport function handleLoadError(err: unknown): string | null {\n\tif (err instanceof DOMException && err.name === 'AbortError') return null;\n\treturn err instanceof Error ? err.message : String(err);\n}\n","/**\n * Formats a byte count into a human-readable string.\n */\nexport function formatFileSize(bytes: number): string {\n\tif (bytes < 0) return '0 B';\n\tif (bytes === 0) return '0 B';\n\n\tconst units = ['B', 'KB', 'MB', 'GB', 'TB'];\n\tconst base = 1024;\n\tconst exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n\tconst value = bytes / base ** exponent;\n\n\t// Use integer display for bytes, one decimal for everything else\n\tif (exponent === 0) return `${bytes} B`;\n\treturn `${value.toFixed(1)} ${units[exponent]}`;\n}\n\n/**\n * Formats a unix timestamp (milliseconds) to a human-readable date string.\n * Shows relative time for recent dates, absolute for older ones.\n */\nexport function formatDate(timestamp: number): string {\n\tif (!timestamp || timestamp <= 0 || !Number.isFinite(timestamp)) return '--';\n\n\tconst date = new Date(timestamp);\n\tconst now = Date.now();\n\tconst diffMs = now - timestamp;\n\tconst diffSeconds = Math.floor(diffMs / 1000);\n\tconst diffMinutes = Math.floor(diffSeconds / 60);\n\tconst diffHours = Math.floor(diffMinutes / 60);\n\tconst diffDays = Math.floor(diffHours / 24);\n\n\tif (diffSeconds < 60) return 'Just now';\n\tif (diffMinutes < 60) return `${diffMinutes}m ago`;\n\tif (diffHours < 24) return `${diffHours}h ago`;\n\tif (diffDays < 7) return `${diffDays}d ago`;\n\n\t// For older dates, show absolute date\n\treturn date.toLocaleDateString(undefined, {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: 'numeric'\n\t});\n}\n\n/**\n * Extracts the file extension from a filename, including the leading dot.\n * Returns an empty string if no extension is found.\n */\nexport function getFileExtension(filename: string): string {\n\tconst lastDot = filename.lastIndexOf('.');\n\tif (lastDot <= 0) return '';\n\treturn filename.slice(lastDot).toLowerCase();\n}\n\n/**\n * JSON replacer that converts BigInt values to strings.\n * Use with `JSON.stringify(value, jsonReplacerBigInt)`.\n */\nexport function jsonReplacerBigInt(_key: string, value: unknown): unknown {\n\treturn typeof value === 'bigint' ? value.toString() : value;\n}\n\n/**\n * Format a value for display in tables, attribute panels, and exports.\n * Handles null, undefined, Date, BigInt, and objects uniformly.\n */\nexport function formatValue(value: unknown): string {\n\tif (value === null || value === undefined) return 'NULL';\n\tif (value instanceof Date) return value.toISOString();\n\tif (typeof value === 'bigint') return value.toString();\n\tif (typeof value === 'object') return JSON.stringify(value, jsonReplacerBigInt);\n\treturn String(value);\n}\n","/**\n * Direct WKB → GeoArrow bridge (zero-copy).\n *\n * Reads raw WKB binary directly into pre-allocated Arrow typed arrays\n * without any intermediate JS object allocation. No parseWKB(), no GeoJSON.\n *\n * Data flow: WKB Uint8Array[] → DataView binary reads → Float64Array/Int32Array\n * → arrow.makeData() → arrow.Table with ARROW:extension:name metadata\n */\n\nimport type { Data } from 'apache-arrow';\nimport {\n\tField,\n\tFixedSizeList,\n\tFloat64,\n\tList,\n\tmakeData,\n\tRecordBatch,\n\tSchema,\n\tStruct,\n\tTable,\n\tUtf8\n} from 'apache-arrow';\n\nexport type GeoArrowGeomType =\n\t| 'point'\n\t| 'linestring'\n\t| 'polygon'\n\t| 'multipoint'\n\t| 'multilinestring'\n\t| 'multipolygon';\n\nexport interface GeoArrowResult {\n\ttable: Table;\n\tgeometryType: GeoArrowGeomType;\n\tbounds: [number, number, number, number]; // [minX, minY, maxX, maxY]\n\t/** Maps local table row index → original WKB array index (for selection lookup). */\n\tsourceIndices: number[];\n}\n\n/** Map DuckDB ST_GeometryType output to our normalized type. */\nexport function normalizeGeomType(raw: string): GeoArrowGeomType {\n\tconst s = raw.toUpperCase().replace(/\\s+/g, '');\n\tif (s === 'POINT') return 'point';\n\tif (s === 'LINESTRING') return 'linestring';\n\tif (s === 'POLYGON') return 'polygon';\n\tif (s === 'MULTIPOINT') return 'multipoint';\n\tif (s === 'MULTILINESTRING') return 'multilinestring';\n\tif (s === 'MULTIPOLYGON') return 'multipolygon';\n\treturn 'polygon'; // fallback\n}\n\n/** GeoArrow extension name for each geometry type. */\nconst EXTENSION_NAMES: Record<GeoArrowGeomType, string> = {\n\tpoint: 'geoarrow.point',\n\tlinestring: 'geoarrow.linestring',\n\tpolygon: 'geoarrow.polygon',\n\tmultipoint: 'geoarrow.multipoint',\n\tmultilinestring: 'geoarrow.multilinestring',\n\tmultipolygon: 'geoarrow.multipolygon'\n};\n\n// ─── WKB binary header reader ────────────────────────────────────────\n\ninterface WkbHeader {\n\ttype: number; // base geometry type (1–6)\n\tle: boolean; // little-endian\n\tcoordStride: number; // bytes per coordinate point (16=2D, 24=3D/M, 32=ZM)\n\tdataOffset: number; // byte offset where geometry data begins\n}\n\n/** Read WKB/EWKB header — 5 bytes + optional SRID. No allocations. */\nfunction readWkbHeader(wkb: Uint8Array): WkbHeader | null {\n\tif (wkb.length < 5) return null;\n\tconst le = wkb[0] === 1;\n\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\tconst rawType = dv.getUint32(1, le);\n\n\tlet headerSize = 5; // byte_order(1) + type(4)\n\n\t// EWKB SRID flag — 4 extra bytes after type\n\tif ((rawType & 0x20000000) !== 0) headerSize += 4;\n\n\t// EWKB dimension flags\n\tconst ewkbZ = (rawType & 0x80000000) !== 0;\n\tconst ewkbM = (rawType & 0x40000000) !== 0;\n\n\t// Strip all EWKB flags to get base type\n\tlet type = rawType & 0x0fffffff;\n\n\t// ISO Z/M ranges: 1001–1006 (Z), 2001–2006 (M), 3001–3006 (ZM)\n\tlet isoZ = false;\n\tlet isoM = false;\n\tif (type > 3000) {\n\t\tisoZ = true;\n\t\tisoM = true;\n\t\ttype -= 3000;\n\t} else if (type > 2000) {\n\t\tisoM = true;\n\t\ttype -= 2000;\n\t} else if (type > 1000) {\n\t\tisoZ = true;\n\t\ttype -= 1000;\n\t}\n\n\tconst dims = (ewkbZ || isoZ ? 1 : 0) + (ewkbM || isoM ? 1 : 0);\n\tconst coordStride = (2 + dims) * 8; // 16, 24, or 32 bytes\n\n\treturn { type, le, coordStride, dataOffset: headerSize };\n}\n\n/** Classify WKB type from first 5 bytes. No full parse. */\nfunction classifyWkbType(wkb: Uint8Array): GeoArrowGeomType | null {\n\tconst h = readWkbHeader(wkb);\n\tif (!h) return null;\n\tswitch (h.type) {\n\t\tcase 1:\n\t\t\treturn 'point';\n\t\tcase 2:\n\t\t\treturn 'linestring';\n\t\tcase 3:\n\t\t\treturn 'polygon';\n\t\tcase 4:\n\t\t\treturn 'multipoint';\n\t\tcase 5:\n\t\t\treturn 'multilinestring';\n\t\tcase 6:\n\t\t\treturn 'multipolygon';\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n// ─── Bounds tracking ─────────────────────────────────────────────────\n\ninterface BoundsTracker {\n\tminX: number;\n\tminY: number;\n\tmaxX: number;\n\tmaxY: number;\n}\n\nfunction newBounds(): BoundsTracker {\n\treturn { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity };\n}\n\n/** Update bounds, skipping NaN coordinates (EMPTY geometries, invalid data). */\nfunction expandBounds(b: BoundsTracker, x: number, y: number) {\n\tif (Number.isNaN(x) || Number.isNaN(y)) return;\n\tif (x < b.minX) b.minX = x;\n\tif (y < b.minY) b.minY = y;\n\tif (x > b.maxX) b.maxX = x;\n\tif (y > b.maxY) b.maxY = y;\n}\n\n// ─── Arrow coordinate type (shared) ─────────────────────────────────\n\nconst coordField = new Field('xy', new Float64());\nconst coordType = new FixedSizeList(2, coordField);\n\n/** Build FixedSizeList<Float64> Data from a pre-allocated Float64Array. */\nfunction makeCoordData(coords: Float64Array, numPoints: number): Data<FixedSizeList> {\n\tconst floatData = makeData({ type: new Float64(), length: coords.length, data: coords });\n\treturn makeData({ type: coordType, length: numPoints, nullCount: 0, child: floatData });\n}\n\n// ─── Direct WKB → Arrow builders (zero intermediate objects) ─────────\n\n/**\n * POINT: [byte_order:1][type:4][x:8][y:8]\n * Direct read — 2 Float64 reads per geometry. Zero parseWKB.\n */\nfunction buildPointData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst coords = new Float64Array(n * 2);\n\n\tfor (let i = 0; i < n; i++) {\n\t\tconst wkb = wkbs[i];\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 1) {\n\t\t\tcoords[i * 2] = 0;\n\t\t\tcoords[i * 2 + 1] = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst x = dv.getFloat64(h.dataOffset, h.le);\n\t\tconst y = dv.getFloat64(h.dataOffset + 8, h.le);\n\t\tcoords[i * 2] = x;\n\t\tcoords[i * 2 + 1] = y;\n\t\texpandBounds(b, x, y);\n\t}\n\n\treturn makeCoordData(coords, n);\n}\n\n/**\n * LINESTRING: [byte_order:1][type:4][num_points:4][x:8,y:8 × n]\n * Two-pass: count first to pre-allocate, then extract.\n */\nfunction buildLineStringData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst geomOffsets = new Int32Array(n + 1);\n\tlet totalCoords = 0;\n\n\t// Pass 1: count coordinates\n\tfor (let i = 0; i < n; i++) {\n\t\tgeomOffsets[i] = totalCoords;\n\t\tconst h = readWkbHeader(wkbs[i]);\n\t\tif (!h || h.type !== 2) continue;\n\t\tconst dv = new DataView(wkbs[i].buffer, wkbs[i].byteOffset, wkbs[i].byteLength);\n\t\tconst numPts = dv.getUint32(h.dataOffset, h.le);\n\t\ttotalCoords += numPts;\n\t}\n\tgeomOffsets[n] = totalCoords;\n\n\t// Pass 2: extract coordinates directly from binary\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 2) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numPts = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\tconst x = dv.getFloat64(off, h.le);\n\t\t\tconst y = dv.getFloat64(off + 8, h.le);\n\t\t\tcoords[ci++] = x;\n\t\t\tcoords[ci++] = y;\n\t\t\texpandBounds(b, x, y);\n\t\t\toff += h.coordStride;\n\t\t}\n\t}\n\n\tconst fslData = makeCoordData(coords, totalCoords);\n\tconst listType = new List(new Field('vertices', coordType));\n\treturn makeData({\n\t\ttype: listType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: fslData\n\t});\n}\n\n/**\n * POLYGON: [byte_order:1][type:4][num_rings:4]\n * { [num_points:4][x:8,y:8 × n] } × rings\n * Two-pass: count rings+coords first, then extract.\n */\nfunction buildPolygonData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst geomOffsets = new Int32Array(n + 1);\n\tlet totalRings = 0;\n\tlet totalCoords = 0;\n\n\t// Pass 1: count rings and coordinates\n\tfor (let i = 0; i < n; i++) {\n\t\tgeomOffsets[i] = totalRings;\n\t\tconst h = readWkbHeader(wkbs[i]);\n\t\tif (!h || h.type !== 3) continue;\n\t\tconst dv = new DataView(wkbs[i].buffer, wkbs[i].byteOffset, wkbs[i].byteLength);\n\t\tconst numRings = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let r = 0; r < numRings; r++) {\n\t\t\tconst numPts = dv.getUint32(off, h.le);\n\t\t\toff += 4 + numPts * h.coordStride;\n\t\t\ttotalCoords += numPts;\n\t\t\ttotalRings++;\n\t\t}\n\t}\n\tgeomOffsets[n] = totalRings;\n\n\t// Pass 2: extract coordinates and ring offsets\n\tconst ringOffsets = new Int32Array(totalRings + 1);\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet ri = 0;\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 3) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numRings = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let r = 0; r < numRings; r++) {\n\t\t\tringOffsets[ri++] = ci >> 1; // coordIndex = ci / 2\n\t\t\tconst numPts = dv.getUint32(off, h.le);\n\t\t\toff += 4;\n\t\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\t\tconst x = dv.getFloat64(off, h.le);\n\t\t\t\tconst y = dv.getFloat64(off + 8, h.le);\n\t\t\t\tcoords[ci++] = x;\n\t\t\t\tcoords[ci++] = y;\n\t\t\t\texpandBounds(b, x, y);\n\t\t\t\toff += h.coordStride;\n\t\t\t}\n\t\t}\n\t}\n\tringOffsets[totalRings] = ci >> 1;\n\n\tconst coordCount = ci >> 1;\n\tconst fslData = makeCoordData(coords, coordCount);\n\n\tconst ringListType = new List(new Field('vertices', coordType));\n\tconst ringListData = makeData({\n\t\ttype: ringListType,\n\t\tlength: totalRings,\n\t\tnullCount: 0,\n\t\tvalueOffsets: ringOffsets,\n\t\tchild: fslData\n\t});\n\n\tconst polyType = new List(new Field('rings', ringListType));\n\treturn makeData({\n\t\ttype: polyType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: ringListData\n\t});\n}\n\n/** MultiPoint has same Arrow structure as LineString: List<FixedSizeList(2)>. */\nfunction buildMultiPointData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\t// MultiPoint WKB: [header][num_points:4]{Point WKB × n}\n\t// Each inner point has its own WKB header.\n\tconst n = wkbs.length;\n\tconst geomOffsets = new Int32Array(n + 1);\n\tlet totalCoords = 0;\n\n\t// Pass 1: count\n\tfor (let i = 0; i < n; i++) {\n\t\tgeomOffsets[i] = totalCoords;\n\t\tconst h = readWkbHeader(wkbs[i]);\n\t\tif (!h || h.type !== 4) continue;\n\t\tconst dv = new DataView(wkbs[i].buffer, wkbs[i].byteOffset, wkbs[i].byteLength);\n\t\ttotalCoords += dv.getUint32(h.dataOffset, h.le);\n\t}\n\tgeomOffsets[n] = totalCoords;\n\n\t// Pass 2: extract from inner point WKBs\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 4) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numPts = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\t// Each inner point is a full WKB: skip its header to get coords\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (innerH) {\n\t\t\t\tconst x = dv.getFloat64(off + innerH.dataOffset, innerH.le);\n\t\t\t\tconst y = dv.getFloat64(off + innerH.dataOffset + 8, innerH.le);\n\t\t\t\tcoords[ci++] = x;\n\t\t\t\tcoords[ci++] = y;\n\t\t\t\texpandBounds(b, x, y);\n\t\t\t\toff += innerH.dataOffset + innerH.coordStride;\n\t\t\t} else {\n\t\t\t\tcoords[ci++] = 0;\n\t\t\t\tcoords[ci++] = 0;\n\t\t\t\toff += 21; // minimum point WKB size\n\t\t\t}\n\t\t}\n\t}\n\n\tconst fslData = makeCoordData(coords, totalCoords);\n\tconst listType = new List(new Field('vertices', coordType));\n\treturn makeData({\n\t\ttype: listType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: fslData\n\t});\n}\n\n/**\n * MULTILINESTRING: [header][num_lines:4]{LineString WKB × n}\n * Each inner LineString has its own WKB header.\n */\nfunction buildMultiLineStringData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst geomOffsetsArr: number[] = [0];\n\tlet totalLines = 0;\n\tlet totalCoords = 0;\n\n\t// Pass 1: count lines and coordinates\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 5) {\n\t\t\tgeomOffsetsArr.push(totalLines);\n\t\t\tcontinue;\n\t\t}\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numLines = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let l = 0; l < numLines; l++) {\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (!innerH) break;\n\t\t\tconst innerDv = new DataView(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off);\n\t\t\tconst numPts = innerDv.getUint32(innerH.dataOffset, innerH.le);\n\t\t\ttotalCoords += numPts;\n\t\t\toff += innerH.dataOffset + 4 + numPts * innerH.coordStride;\n\t\t\ttotalLines++;\n\t\t}\n\t\tgeomOffsetsArr.push(totalLines);\n\t}\n\n\t// Pass 2: extract\n\tconst geomOffsets = new Int32Array(geomOffsetsArr);\n\tconst lineOffsets = new Int32Array(totalLines + 1);\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet li = 0;\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 5) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numLines = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let l = 0; l < numLines; l++) {\n\t\t\tlineOffsets[li++] = ci >> 1;\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (!innerH) break;\n\t\t\tconst numPts = new DataView(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off).getUint32(\n\t\t\t\tinnerH.dataOffset,\n\t\t\t\tinnerH.le\n\t\t\t);\n\t\t\tlet ptOff = off + innerH.dataOffset + 4;\n\t\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\t\tconst x = dv.getFloat64(ptOff, innerH.le);\n\t\t\t\tconst y = dv.getFloat64(ptOff + 8, innerH.le);\n\t\t\t\tcoords[ci++] = x;\n\t\t\t\tcoords[ci++] = y;\n\t\t\t\texpandBounds(b, x, y);\n\t\t\t\tptOff += innerH.coordStride;\n\t\t\t}\n\t\t\toff = ptOff;\n\t\t}\n\t}\n\tlineOffsets[totalLines] = ci >> 1;\n\n\tconst fslData = makeCoordData(coords, ci >> 1);\n\tconst lineListType = new List(new Field('vertices', coordType));\n\tconst lineListData = makeData({\n\t\ttype: lineListType,\n\t\tlength: totalLines,\n\t\tnullCount: 0,\n\t\tvalueOffsets: lineOffsets,\n\t\tchild: fslData\n\t});\n\n\tconst multiLineType = new List(new Field('lines', lineListType));\n\treturn makeData({\n\t\ttype: multiLineType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: lineListData\n\t});\n}\n\n/**\n * MULTIPOLYGON: [header][num_polys:4]{Polygon WKB × n}\n * Each inner Polygon has its own WKB header.\n */\nfunction buildMultiPolygonData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst geomOffsetsArr: number[] = [0];\n\tlet totalPolys = 0;\n\tlet totalRings = 0;\n\tlet totalCoords = 0;\n\n\t// Pass 1: count polygons, rings, coordinates\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 6) {\n\t\t\tgeomOffsetsArr.push(totalPolys);\n\t\t\tcontinue;\n\t\t}\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numPolys = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let p = 0; p < numPolys; p++) {\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (!innerH) break;\n\t\t\tconst innerDv = new DataView(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off);\n\t\t\tconst numRings = innerDv.getUint32(innerH.dataOffset, innerH.le);\n\t\t\tlet ringOff = innerH.dataOffset + 4;\n\t\t\tfor (let r = 0; r < numRings; r++) {\n\t\t\t\tconst numPts = innerDv.getUint32(ringOff, innerH.le);\n\t\t\t\tringOff += 4 + numPts * innerH.coordStride;\n\t\t\t\ttotalCoords += numPts;\n\t\t\t\ttotalRings++;\n\t\t\t}\n\t\t\toff += ringOff;\n\t\t\ttotalPolys++;\n\t\t}\n\t\tgeomOffsetsArr.push(totalPolys);\n\t}\n\n\t// Pass 2: extract\n\tconst geomOffsets = new Int32Array(geomOffsetsArr);\n\tconst polyOffsets = new Int32Array(totalPolys + 1);\n\tconst ringOffsets = new Int32Array(totalRings + 1);\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet pi = 0;\n\tlet ri = 0;\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 6) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numPolys = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let p = 0; p < numPolys; p++) {\n\t\t\tpolyOffsets[pi++] = ri;\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (!innerH) break;\n\t\t\tconst innerDv = new DataView(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off);\n\t\t\tconst numRings = innerDv.getUint32(innerH.dataOffset, innerH.le);\n\t\t\tlet ringOff = off + innerH.dataOffset + 4;\n\t\t\tfor (let r = 0; r < numRings; r++) {\n\t\t\t\tringOffsets[ri++] = ci >> 1;\n\t\t\t\tconst numPts = dv.getUint32(ringOff, innerH.le);\n\t\t\t\tringOff += 4;\n\t\t\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\t\t\tconst x = dv.getFloat64(ringOff, innerH.le);\n\t\t\t\t\tconst y = dv.getFloat64(ringOff + 8, innerH.le);\n\t\t\t\t\tcoords[ci++] = x;\n\t\t\t\t\tcoords[ci++] = y;\n\t\t\t\t\texpandBounds(b, x, y);\n\t\t\t\t\tringOff += innerH.coordStride;\n\t\t\t\t}\n\t\t\t}\n\t\t\toff = ringOff;\n\t\t}\n\t}\n\tpolyOffsets[totalPolys] = ri;\n\tringOffsets[totalRings] = ci >> 1;\n\n\tconst fslData = makeCoordData(coords, ci >> 1);\n\n\tconst ringListType = new List(new Field('vertices', coordType));\n\tconst ringListData = makeData({\n\t\ttype: ringListType,\n\t\tlength: totalRings,\n\t\tnullCount: 0,\n\t\tvalueOffsets: ringOffsets,\n\t\tchild: fslData\n\t});\n\n\tconst polyListType = new List(new Field('rings', ringListType));\n\tconst polyListData = makeData({\n\t\ttype: polyListType,\n\t\tlength: totalPolys,\n\t\tnullCount: 0,\n\t\tvalueOffsets: polyOffsets,\n\t\tchild: ringListData\n\t});\n\n\tconst multiPolyType = new List(new Field('polygons', polyListType));\n\treturn makeData({\n\t\ttype: multiPolyType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: polyListData\n\t});\n}\n\n// ─── Build a single GeoArrow table for one type group ────────────────\n\n/** Build attribute columns for a subset of rows identified by indices. */\nfunction buildAttributeColumns(\n\tindices: number[],\n\tattributes: Map<string, { values: any[]; type: string }>\n): { fields: Field[]; data: Data[] } {\n\tconst n = indices.length;\n\tconst fields: Field[] = [];\n\tconst dataArr: Data[] = [];\n\n\tfor (const [name, col] of attributes) {\n\t\tconst { values } = col;\n\n\t\t// Detect whether values are numeric or string\n\t\tlet isNumeric = true;\n\t\tconst sampleEnd = Math.min(n, 100);\n\t\tfor (let i = 0; i < sampleEnd; i++) {\n\t\t\tif (values[indices[i]] != null && typeof values[indices[i]] !== 'number') {\n\t\t\t\tisNumeric = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (isNumeric) {\n\t\t\tconst arr = new Float64Array(n);\n\t\t\tfor (let i = 0; i < n; i++) arr[i] = values[indices[i]] ?? NaN;\n\t\t\tconst data = makeData({ type: new Float64(), length: n, data: arr });\n\t\t\tfields.push(new Field(name, new Float64(), true));\n\t\t\tdataArr.push(data);\n\t\t} else {\n\t\t\tconst encoder = new TextEncoder();\n\t\t\tconst offsets = new Int32Array(n + 1);\n\t\t\tlet totalBytes = 0;\n\n\t\t\t// Single pass: encode directly into a growing buffer\n\t\t\tconst strParts: Uint8Array[] = [];\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\toffsets[i] = totalBytes;\n\t\t\t\tconst s = values[indices[i]] != null ? String(values[indices[i]]) : '';\n\t\t\t\tconst encoded = encoder.encode(s);\n\t\t\t\tstrParts.push(encoded);\n\t\t\t\ttotalBytes += encoded.length;\n\t\t\t}\n\t\t\toffsets[n] = totalBytes;\n\n\t\t\tconst valueBuffer = new Uint8Array(totalBytes);\n\t\t\tlet pos = 0;\n\t\t\tfor (const sv of strParts) {\n\t\t\t\tvalueBuffer.set(sv, pos);\n\t\t\t\tpos += sv.length;\n\t\t\t}\n\n\t\t\tconst data = makeData({\n\t\t\t\ttype: new Utf8(),\n\t\t\t\tlength: n,\n\t\t\t\tvalueOffsets: offsets,\n\t\t\t\tdata: valueBuffer\n\t\t\t});\n\t\t\tfields.push(new Field(name, new Utf8(), true));\n\t\t\tdataArr.push(data);\n\t\t}\n\t}\n\n\treturn { fields, data: dataArr };\n}\n\n/** Build a single GeoArrow table for one geometry type group. */\nfunction buildSingleTable(\n\tgeomType: GeoArrowGeomType,\n\twkbs: Uint8Array[],\n\tindices: number[],\n\tattributes: Map<string, { values: any[]; type: string }>,\n\tb: BoundsTracker\n): GeoArrowResult {\n\tconst n = wkbs.length;\n\n\tlet geomData: Data;\n\tswitch (geomType) {\n\t\tcase 'point':\n\t\t\tgeomData = buildPointData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'linestring':\n\t\t\tgeomData = buildLineStringData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'polygon':\n\t\t\tgeomData = buildPolygonData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'multipoint':\n\t\t\tgeomData = buildMultiPointData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'multilinestring':\n\t\t\tgeomData = buildMultiLineStringData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'multipolygon':\n\t\t\tgeomData = buildMultiPolygonData(wkbs, b);\n\t\t\tbreak;\n\t}\n\n\tconst extensionName = EXTENSION_NAMES[geomType];\n\tconst geomMetadata = new Map<string, string>([\n\t\t['ARROW:extension:name', extensionName],\n\t\t[\n\t\t\t'ARROW:extension:metadata',\n\t\t\tJSON.stringify({\n\t\t\t\tcrs: {\n\t\t\t\t\ttype: 'name',\n\t\t\t\t\tproperties: { name: 'urn:ogc:def:crs:OGC:1.3:CRS84' }\n\t\t\t\t}\n\t\t\t})\n\t\t]\n\t]);\n\n\tconst geomField = new Field('geometry', geomData.type, false, geomMetadata);\n\tconst attrCols = buildAttributeColumns(indices, attributes);\n\n\tconst fields: Field[] = [geomField, ...attrCols.fields];\n\tconst childrenData: Data[] = [geomData, ...attrCols.data];\n\n\tconst arrowSchema = new Schema(fields);\n\tconst structType = new Struct(fields);\n\tconst structData = makeData({\n\t\ttype: structType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tchildren: childrenData\n\t});\n\tconst batch = new RecordBatch(arrowSchema, structData);\n\tconst table = new Table(arrowSchema, batch);\n\n\treturn {\n\t\ttable,\n\t\tgeometryType: geomType,\n\t\tbounds: [b.minX, b.minY, b.maxX, b.maxY],\n\t\tsourceIndices: indices\n\t};\n}\n\n// ─── Main entry point ────────────────────────────────────────────────\n\n/**\n * Build GeoArrow tables from raw WKB arrays, automatically splitting by geometry type.\n * Returns one GeoArrowResult per non-empty type group, with shared merged bounds.\n *\n * @param wkbArrays Raw WKB binary arrays from DuckDB\n * @param attributes Attribute columns (non-geometry)\n * @param knownGeomType If provided (e.g. from GeoParquet metadata), skip classification\n */\nexport function buildGeoArrowTables(\n\twkbArrays: Uint8Array[],\n\tattributes: Map<string, { values: any[]; type: string }>,\n\tknownGeomType?: GeoArrowGeomType\n): GeoArrowResult[] {\n\tif (wkbArrays.length === 0) return [];\n\n\t// Fast path: known geometry type from metadata — skip classification entirely\n\tif (knownGeomType) {\n\t\tconst globalBounds = newBounds();\n\t\tconst indices = Array.from({ length: wkbArrays.length }, (_, i) => i);\n\t\tconst result = buildSingleTable(knownGeomType, wkbArrays, indices, attributes, globalBounds);\n\t\treturn [result];\n\t}\n\n\t// Classify by reading only the type bytes (5 bytes per WKB, not full parse)\n\tconst groups = new Map<GeoArrowGeomType, { wkbs: Uint8Array[]; indices: number[] }>();\n\n\tfor (let i = 0; i < wkbArrays.length; i++) {\n\t\tconst geomType = classifyWkbType(wkbArrays[i]);\n\t\tif (!geomType) continue;\n\n\t\tlet group = groups.get(geomType);\n\t\tif (!group) {\n\t\t\tgroup = { wkbs: [], indices: [] };\n\t\t\tgroups.set(geomType, group);\n\t\t}\n\t\tgroup.wkbs.push(wkbArrays[i]);\n\t\tgroup.indices.push(i);\n\t}\n\n\tif (groups.size === 0) return [];\n\n\tconst globalBounds = newBounds();\n\tconst results: GeoArrowResult[] = [];\n\n\tfor (const [geomType, { wkbs, indices }] of groups) {\n\t\tconst result = buildSingleTable(geomType, wkbs, indices, attributes, globalBounds);\n\t\tresults.push(result);\n\t}\n\n\t// Share merged bounds across all results\n\tconst mergedBounds: [number, number, number, number] = [\n\t\tglobalBounds.minX,\n\t\tglobalBounds.minY,\n\t\tglobalBounds.maxX,\n\t\tglobalBounds.maxY\n\t];\n\tfor (const r of results) r.bounds = mergedBounds;\n\n\treturn results;\n}\n","export interface HexRow {\n\toffset: string;\n\thex: string[];\n\tascii: string;\n}\n\n/**\n * Generates a hex dump from binary data.\n * Returns rows of offset | hex bytes | ASCII representation.\n */\nexport function generateHexDump(data: Uint8Array, bytesPerRow = 16): HexRow[] {\n\tconst rows: HexRow[] = [];\n\n\tfor (let i = 0; i < data.length; i += bytesPerRow) {\n\t\tconst slice = data.slice(i, i + bytesPerRow);\n\t\tconst offset = i.toString(16).padStart(8, '0');\n\n\t\tconst hex: string[] = [];\n\t\tfor (let j = 0; j < bytesPerRow; j++) {\n\t\t\tif (j < slice.length) {\n\t\t\t\thex.push(slice[j].toString(16).padStart(2, '0'));\n\t\t\t} else {\n\t\t\t\thex.push(' ');\n\t\t\t}\n\t\t}\n\n\t\tlet ascii = '';\n\t\tfor (let j = 0; j < slice.length; j++) {\n\t\t\tconst byte = slice[j];\n\t\t\tascii += byte >= 0x20 && byte <= 0x7e ? String.fromCharCode(byte) : '.';\n\t\t}\n\n\t\trows.push({ offset, hex, ascii });\n\t}\n\n\treturn rows;\n}\n","/**\n * Lightweight Parquet metadata reader using hyparquet.\n *\n * Reads schema, row count, CRS, and geometry types from the Parquet footer\n * via a single HTTP range request (~512KB). No DuckDB boot needed.\n *\n * This provides instant metadata display before DuckDB-WASM finishes loading.\n */\n\nimport { WGS84_CODES } from '../constants.js';\nimport type { GeoArrowGeomType } from './geoarrow.js';\n\nexport interface GeoColumnMeta {\n\tencoding: string;\n\tgeometryTypes: string[];\n\tcrs: any | null;\n\tbbox?: number[];\n}\n\nexport interface GeoParquetMeta {\n\tprimaryColumn: string;\n\tcolumns: Record<string, GeoColumnMeta>;\n}\n\nexport interface ParquetFileMetadata {\n\t/** Total number of rows across all row groups. */\n\trowCount: number;\n\t/** Column schema (name + type). */\n\tschema: { name: string; type: string }[];\n\t/** GeoParquet \"geo\" metadata if present. */\n\tgeo: GeoParquetMeta | null;\n\t/** True when file has legacy GeoParquet metadata (schema_version 0.x without \"version\" field). */\n\tlegacyGeoParquet: boolean;\n\t/** Tool that created the file (e.g. \"pyarrow 15.0.0\"). */\n\tcreatedBy: string | null;\n\t/** Number of row groups. */\n\tnumRowGroups: number;\n\t/** Primary compression codec (e.g. \"SNAPPY\", \"ZSTD\"). */\n\tcompression: string | null;\n}\n\n/** Map hyparquet schema element types to DuckDB-like type strings. */\nfunction mapParquetType(col: any): string {\n\tconst lt = col.logical_type;\n\tif (lt) {\n\t\t// Parquet Format 2.11+ native geometry/geography types\n\t\tif (lt.type === 'GEOMETRY' || lt.type === 'GEOGRAPHY') return 'GEOMETRY';\n\t\t// String types\n\t\tif (lt.type === 'STRING' || lt.type === 'UTF8') return 'VARCHAR';\n\t\tif (lt.type === 'JSON') return 'JSON';\n\t\tif (lt.type === 'UUID') return 'UUID';\n\t\tif (lt.type === 'ENUM') return 'VARCHAR';\n\t\t// Integer types\n\t\tif (lt.type === 'INT' || lt.type === 'INTEGER') {\n\t\t\tconst bits = lt.bitWidth ?? 32;\n\t\t\tconst signed = lt.isSigned !== false;\n\t\t\tif (bits <= 8) return signed ? 'TINYINT' : 'UTINYINT';\n\t\t\tif (bits <= 16) return signed ? 'SMALLINT' : 'USMALLINT';\n\t\t\tif (bits <= 32) return signed ? 'INTEGER' : 'UINTEGER';\n\t\t\treturn signed ? 'BIGINT' : 'UBIGINT';\n\t\t}\n\t\t// Decimal\n\t\tif (lt.type === 'DECIMAL') return `DECIMAL(${lt.precision ?? 18},${lt.scale ?? 0})`;\n\t\t// Date/Time\n\t\tif (lt.type === 'DATE') return 'DATE';\n\t\tif (lt.type === 'TIME') return 'TIME';\n\t\tif (lt.type === 'TIMESTAMP') return 'TIMESTAMP';\n\t\t// Binary\n\t\tif (lt.type === 'BSON') return 'BLOB';\n\t}\n\n\t// Fallback to physical type\n\tconst ct = col.converted_type;\n\tif (ct === 'UTF8') return 'VARCHAR';\n\tif (ct === 'JSON') return 'JSON';\n\tif (ct === 'DATE') return 'DATE';\n\tif (ct === 'TIMESTAMP_MILLIS' || ct === 'TIMESTAMP_MICROS') return 'TIMESTAMP';\n\tif (ct === 'DECIMAL') return `DECIMAL(${col.precision ?? 18},${col.scale ?? 0})`;\n\tif (ct === 'INT_8') return 'TINYINT';\n\tif (ct === 'INT_16') return 'SMALLINT';\n\tif (ct === 'INT_32') return 'INTEGER';\n\tif (ct === 'INT_64') return 'BIGINT';\n\tif (ct === 'UINT_8') return 'UTINYINT';\n\tif (ct === 'UINT_16') return 'USMALLINT';\n\tif (ct === 'UINT_32') return 'UINTEGER';\n\tif (ct === 'UINT_64') return 'UBIGINT';\n\n\tconst pt = col.type;\n\tif (pt === 'BOOLEAN') return 'BOOLEAN';\n\tif (pt === 'INT32') return 'INTEGER';\n\tif (pt === 'INT64') return 'BIGINT';\n\tif (pt === 'INT96') return 'TIMESTAMP';\n\tif (pt === 'FLOAT') return 'FLOAT';\n\tif (pt === 'DOUBLE') return 'DOUBLE';\n\tif (pt === 'BYTE_ARRAY') return 'BLOB';\n\tif (pt === 'FIXED_LEN_BYTE_ARRAY') return 'BLOB';\n\n\treturn 'VARCHAR';\n}\n\n/**\n * Read Parquet footer metadata from a remote URL using hyparquet.\n * Uses HTTP range requests — typically a single ~512KB fetch.\n */\nexport async function readParquetMetadata(url: string): Promise<ParquetFileMetadata> {\n\tconst { parquetMetadataAsync, asyncBufferFromUrl } = await import('hyparquet');\n\n\tconst file = await asyncBufferFromUrl({ url });\n\tconst metadata = await parquetMetadataAsync(file);\n\n\t// Row count from row group metadata (no data scan needed)\n\tconst rowCount = metadata.row_groups.reduce(\n\t\t(sum: number, rg: any) => sum + Number(rg.num_rows),\n\t\t0\n\t);\n\n\t// Schema from metadata (skip root element at index 0)\n\tconst schema = metadata.schema\n\t\t.slice(1)\n\t\t.filter((col: any) => col.num_children === undefined) // skip group elements\n\t\t.map((col: any) => ({\n\t\t\tname: col.name,\n\t\t\ttype: mapParquetType(col)\n\t\t}));\n\n\t// GeoParquet \"geo\" key-value metadata\n\tlet geo: GeoParquetMeta | null = null;\n\tlet legacyGeoParquet = false;\n\tconst geoKv = metadata.key_value_metadata?.find((kv: any) => kv.key === 'geo');\n\tif (geoKv) {\n\t\ttry {\n\t\t\tconst geoJson = JSON.parse(geoKv.value ?? '');\n\n\t\t\t// Detect legacy GeoParquet (schema_version 0.x without \"version\" field).\n\t\t\t// Early geopandas (<0.12) wrote schema_version instead of version.\n\t\t\t// DuckDB's spatial extension rejects these files with:\n\t\t\t// \"Geoparquet metadata does not have a version\"\n\t\t\tif (geoJson.schema_version && !geoJson.version) {\n\t\t\t\tlegacyGeoParquet = true;\n\t\t\t}\n\n\t\t\tgeo = {\n\t\t\t\tprimaryColumn: geoJson.primary_column ?? 'geometry',\n\t\t\t\tcolumns: {}\n\t\t\t};\n\t\t\tif (geoJson.columns) {\n\t\t\t\tfor (const [colName, colMeta] of Object.entries(geoJson.columns) as [string, any][]) {\n\t\t\t\t\tgeo.columns[colName] = {\n\t\t\t\t\t\tencoding: colMeta.encoding ?? 'WKB',\n\t\t\t\t\t\tgeometryTypes: colMeta.geometry_types ?? [],\n\t\t\t\t\t\tcrs: colMeta.crs ?? null,\n\t\t\t\t\t\tbbox: colMeta.bbox\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// malformed geo metadata — ignore\n\t\t}\n\t}\n\n\t// Created-by tool\n\tconst createdBy = metadata.created_by ?? null;\n\n\t// Row group count\n\tconst numRowGroups = metadata.row_groups.length;\n\n\t// Compression: collect unique codecs from first row group's columns\n\tlet compression: string | null = null;\n\tif (numRowGroups > 0 && metadata.row_groups[0].columns) {\n\t\tconst codecs = new Set<string>();\n\t\tfor (const col of metadata.row_groups[0].columns) {\n\t\t\tconst codec = col.meta_data?.codec;\n\t\t\tif (codec) codecs.add(codec);\n\t\t}\n\t\tif (codecs.size === 1) {\n\t\t\tcompression = [...codecs][0];\n\t\t} else if (codecs.size > 1) {\n\t\t\tcompression = [...codecs].join(', ');\n\t\t}\n\t}\n\n\treturn { rowCount, schema, geo, legacyGeoParquet, createdBy, numRowGroups, compression };\n}\n\n/**\n * Extract EPSG code from GeoParquet CRS metadata.\n * Returns null for WGS84/CRS84 (no reprojection needed).\n */\nexport function extractEpsgFromGeoMeta(geo: GeoParquetMeta): string | null {\n\tconst primaryCol = geo.columns[geo.primaryColumn];\n\tif (!primaryCol?.crs) return null;\n\n\tconst crs = primaryCol.crs;\n\n\t// OGC CRS84 is lon/lat WGS84\n\tif (crs.type === 'name' && crs.properties?.name?.includes('CRS84')) return null;\n\n\t// PROJJSON: { \"id\": { \"authority\": \"EPSG\", \"code\": 27700 } }\n\tif (crs.id?.authority === 'EPSG') {\n\t\tconst code = crs.id.code;\n\t\tif (WGS84_CODES.has(code)) return null;\n\t\treturn `EPSG:${code}`;\n\t}\n\n\treturn null;\n}\n\n/**\n * Extract normalized geometry types from GeoParquet metadata.\n * Returns the set of geometry types for the primary column.\n */\nexport function extractGeometryTypes(geo: GeoParquetMeta): GeoArrowGeomType[] {\n\tconst primaryCol = geo.columns[geo.primaryColumn];\n\tif (!primaryCol?.geometryTypes?.length) return [];\n\n\tconst typeMap: Record<string, GeoArrowGeomType> = {\n\t\tPoint: 'point',\n\t\tLineString: 'linestring',\n\t\tPolygon: 'polygon',\n\t\tMultiPoint: 'multipoint',\n\t\tMultiLineString: 'multilinestring',\n\t\tMultiPolygon: 'multipolygon'\n\t};\n\n\tconst types: GeoArrowGeomType[] = [];\n\tfor (const raw of primaryCol.geometryTypes) {\n\t\t// GeoParquet geometry_types may include Z/M suffixes like \"Polygon Z\"\n\t\tconst base = raw.split(' ')[0];\n\t\tconst mapped = typeMap[base];\n\t\tif (mapped && !types.includes(mapped)) types.push(mapped);\n\t}\n\treturn types;\n}\n\n/**\n * Extract bounds from GeoParquet metadata (bbox field).\n * Returns [minX, minY, maxX, maxY] or null.\n */\nexport function extractBounds(geo: GeoParquetMeta): [number, number, number, number] | null {\n\tconst primaryCol = geo.columns[geo.primaryColumn];\n\tif (!primaryCol?.bbox || primaryCol.bbox.length < 4) return null;\n\treturn [primaryCol.bbox[0], primaryCol.bbox[1], primaryCol.bbox[2], primaryCol.bbox[3]];\n}\n","/**\n * Provider registry — single source of truth for all cloud storage providers.\n *\n * Centralizes endpoint patterns, regions, auth methods, and UI metadata.\n * Used by ConnectionDialog, browser-cloud adapter, host-detection, url-state, etc.\n */\n\n// ---------------------------------------------------------------------------\n// Provider type — the canonical union used by Connection, ConnectionConfig, etc.\n// ---------------------------------------------------------------------------\n\nexport type ProviderId =\n\t| 's3'\n\t| 'gcs'\n\t| 'r2'\n\t| 'minio'\n\t| 'azure'\n\t| 'storj'\n\t| 'b2'\n\t| 'digitalocean'\n\t| 'wasabi'\n\t| 'contabo'\n\t| 'hetzner'\n\t| 'linode'\n\t| 'ovhcloud';\n\n// ---------------------------------------------------------------------------\n// Region definition\n// ---------------------------------------------------------------------------\n\nexport interface ProviderRegion {\n\tcode: string;\n\tlabel: string;\n}\n\n// ---------------------------------------------------------------------------\n// Provider definition\n// ---------------------------------------------------------------------------\n\nexport interface ProviderDef {\n\t/** Display label in the UI. */\n\tlabel: string;\n\t/** Short description shown as helper text. */\n\tdescription: string;\n\t/** Auth method used by this provider. */\n\tauthMethod: 'sigv4' | 'sas-token';\n\t/** Whether the region field is relevant for this provider. */\n\tneedsRegion: boolean;\n\t/** Whether the endpoint field is required. */\n\tneedsEndpoint: boolean;\n\t/** Default region when creating a new connection. */\n\tdefaultRegion: string;\n\t/**\n\t * Endpoint template with `{region}` placeholder.\n\t * If null, the user must provide a custom endpoint (e.g. MinIO).\n\t * If a fixed string (no `{region}`), it's always the same (e.g. GCS).\n\t */\n\tendpointTemplate: string | null;\n\t/** Known regions with labels. Empty = free-form region input. */\n\tregions: ProviderRegion[];\n\t/** Bucket label override (e.g. Azure uses \"Container\"). */\n\tbucketLabel?: string;\n\t/** Default endpoint placeholder shown in the input. */\n\tendpointPlaceholder: string;\n\t/** URI schemes that map to this provider (lowercase, without \"://\"). */\n\tschemes: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nexport const PROVIDERS: Record<ProviderId, ProviderDef> = {\n\ts3: {\n\t\tlabel: 'AWS S3',\n\t\tdescription: 'Amazon S3 or any S3-compatible service',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us-east-1',\n\t\tendpointTemplate: null,\n\t\tregions: [\n\t\t\t{ code: 'us-east-1', label: 'US East (N. Virginia)' },\n\t\t\t{ code: 'us-east-2', label: 'US East (Ohio)' },\n\t\t\t{ code: 'us-west-1', label: 'US West (N. California)' },\n\t\t\t{ code: 'us-west-2', label: 'US West (Oregon)' },\n\t\t\t{ code: 'eu-west-1', label: 'EU (Ireland)' },\n\t\t\t{ code: 'eu-west-2', label: 'EU (London)' },\n\t\t\t{ code: 'eu-west-3', label: 'EU (Paris)' },\n\t\t\t{ code: 'eu-central-1', label: 'EU (Frankfurt)' },\n\t\t\t{ code: 'eu-central-2', label: 'EU (Zurich)' },\n\t\t\t{ code: 'eu-north-1', label: 'EU (Stockholm)' },\n\t\t\t{ code: 'eu-south-1', label: 'EU (Milan)' },\n\t\t\t{ code: 'eu-south-2', label: 'EU (Spain)' },\n\t\t\t{ code: 'ap-northeast-1', label: 'Asia Pacific (Tokyo)' },\n\t\t\t{ code: 'ap-northeast-2', label: 'Asia Pacific (Seoul)' },\n\t\t\t{ code: 'ap-northeast-3', label: 'Asia Pacific (Osaka)' },\n\t\t\t{ code: 'ap-southeast-1', label: 'Asia Pacific (Singapore)' },\n\t\t\t{ code: 'ap-southeast-2', label: 'Asia Pacific (Sydney)' },\n\t\t\t{ code: 'ap-southeast-3', label: 'Asia Pacific (Jakarta)' },\n\t\t\t{ code: 'ap-south-1', label: 'Asia Pacific (Mumbai)' },\n\t\t\t{ code: 'ap-south-2', label: 'Asia Pacific (Hyderabad)' },\n\t\t\t{ code: 'ap-east-1', label: 'Asia Pacific (Hong Kong)' },\n\t\t\t{ code: 'sa-east-1', label: 'South America (São Paulo)' },\n\t\t\t{ code: 'ca-central-1', label: 'Canada (Central)' },\n\t\t\t{ code: 'ca-west-1', label: 'Canada (Calgary)' },\n\t\t\t{ code: 'me-south-1', label: 'Middle East (Bahrain)' },\n\t\t\t{ code: 'me-central-1', label: 'Middle East (UAE)' },\n\t\t\t{ code: 'af-south-1', label: 'Africa (Cape Town)' },\n\t\t\t{ code: 'il-central-1', label: 'Israel (Tel Aviv)' }\n\t\t],\n\t\tendpointPlaceholder: 'Leave empty for AWS, or enter custom S3 endpoint',\n\t\tschemes: ['s3', 's3a', 's3n', 'aws']\n\t},\n\n\tgcs: {\n\t\tlabel: 'Google Cloud',\n\t\tdescription: 'Google Cloud Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'auto',\n\t\tendpointTemplate: 'https://storage.googleapis.com',\n\t\tregions: [],\n\t\tendpointPlaceholder: 'https://storage.googleapis.com',\n\t\tschemes: ['gs', 'gcs']\n\t},\n\n\tr2: {\n\t\tlabel: 'Cloudflare R2',\n\t\tdescription: 'Cloudflare R2 Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: true,\n\t\tdefaultRegion: 'auto',\n\t\tendpointTemplate: null,\n\t\tregions: [],\n\t\tendpointPlaceholder: 'https://<account-id>.r2.cloudflarestorage.com',\n\t\tschemes: ['r2']\n\t},\n\n\tazure: {\n\t\tlabel: 'Azure',\n\t\tdescription: 'Azure Blob Storage',\n\t\tauthMethod: 'sas-token',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: true,\n\t\tdefaultRegion: '',\n\t\tendpointTemplate: null,\n\t\tregions: [],\n\t\tbucketLabel: 'Container',\n\t\tendpointPlaceholder: 'https://<account>.blob.core.windows.net',\n\t\tschemes: ['azure', 'az', 'abfs', 'abfss', 'wasbs', 'adl']\n\t},\n\n\tminio: {\n\t\tlabel: 'MinIO',\n\t\tdescription: 'Self-hosted MinIO or S3-compatible',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: true,\n\t\tdefaultRegion: 'us-east-1',\n\t\tendpointTemplate: null,\n\t\tregions: [],\n\t\tendpointPlaceholder: 'https://minio.example.com or http://localhost:9000',\n\t\tschemes: []\n\t},\n\n\tstorj: {\n\t\tlabel: 'Storj',\n\t\tdescription: 'Storj Decentralized Cloud',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us1',\n\t\tendpointTemplate: 'https://gateway.storjshare.io',\n\t\tregions: [\n\t\t\t{ code: 'us1', label: 'US1' },\n\t\t\t{ code: 'eu1', label: 'EU1' },\n\t\t\t{ code: 'ap1', label: 'AP1' }\n\t\t],\n\t\tendpointPlaceholder: 'https://gateway.storjshare.io',\n\t\tschemes: ['storj', 'sj']\n\t},\n\n\tb2: {\n\t\tlabel: 'Backblaze B2',\n\t\tdescription: 'Backblaze B2 Cloud Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us-west-004',\n\t\tendpointTemplate: 'https://s3.{region}.backblazeb2.com',\n\t\tregions: [\n\t\t\t{ code: 'us-west-000', label: 'US West (Sacramento)' },\n\t\t\t{ code: 'us-west-001', label: 'US West (Stockton)' },\n\t\t\t{ code: 'us-west-002', label: 'US West (Phoenix)' },\n\t\t\t{ code: 'us-west-004', label: 'US West' },\n\t\t\t{ code: 'us-east-005', label: 'US East (Reston)' },\n\t\t\t{ code: 'eu-central-003', label: 'EU Central (Amsterdam)' },\n\t\t\t{ code: 'ca-central-001', label: 'Canada (Toronto)' }\n\t\t],\n\t\tendpointPlaceholder: 'https://s3.us-west-004.backblazeb2.com',\n\t\tschemes: []\n\t},\n\n\tdigitalocean: {\n\t\tlabel: 'DigitalOcean',\n\t\tdescription: 'DigitalOcean Spaces',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'nyc3',\n\t\tendpointTemplate: 'https://{region}.digitaloceanspaces.com',\n\t\tregions: [\n\t\t\t{ code: 'nyc3', label: 'New York 3' },\n\t\t\t{ code: 'sfo3', label: 'San Francisco 3' },\n\t\t\t{ code: 'ams3', label: 'Amsterdam 3' },\n\t\t\t{ code: 'sgp1', label: 'Singapore 1' },\n\t\t\t{ code: 'lon1', label: 'London 1' },\n\t\t\t{ code: 'fra1', label: 'Frankfurt 1' },\n\t\t\t{ code: 'tor1', label: 'Toronto 1' },\n\t\t\t{ code: 'blr1', label: 'Bangalore 1' },\n\t\t\t{ code: 'syd1', label: 'Sydney 1' }\n\t\t],\n\t\tendpointPlaceholder: 'https://nyc3.digitaloceanspaces.com',\n\t\tschemes: []\n\t},\n\n\twasabi: {\n\t\tlabel: 'Wasabi',\n\t\tdescription: 'Wasabi Hot Cloud Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us-east-1',\n\t\tendpointTemplate: 'https://s3.{region}.wasabisys.com',\n\t\tregions: [\n\t\t\t{ code: 'us-east-1', label: 'US East 1 (Virginia)' },\n\t\t\t{ code: 'us-east-2', label: 'US East 2 (Virginia)' },\n\t\t\t{ code: 'us-central-1', label: 'US Central 1 (Texas)' },\n\t\t\t{ code: 'us-west-1', label: 'US West 1 (Oregon)' },\n\t\t\t{ code: 'eu-central-1', label: 'EU Central 1 (Amsterdam)' },\n\t\t\t{ code: 'eu-central-2', label: 'EU Central 2 (Frankfurt)' },\n\t\t\t{ code: 'eu-west-1', label: 'EU West 1 (London)' },\n\t\t\t{ code: 'eu-west-2', label: 'EU West 2 (Paris)' },\n\t\t\t{ code: 'ap-northeast-1', label: 'AP Northeast 1 (Tokyo)' },\n\t\t\t{ code: 'ap-northeast-2', label: 'AP Northeast 2 (Osaka)' },\n\t\t\t{ code: 'ap-southeast-1', label: 'AP Southeast 1 (Singapore)' },\n\t\t\t{ code: 'ap-southeast-2', label: 'AP Southeast 2 (Sydney)' },\n\t\t\t{ code: 'ca-central-1', label: 'Canada (Toronto)' }\n\t\t],\n\t\tendpointPlaceholder: 'https://s3.us-east-1.wasabisys.com',\n\t\tschemes: []\n\t},\n\n\tcontabo: {\n\t\tlabel: 'Contabo',\n\t\tdescription: 'Contabo Object Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'eu2',\n\t\tendpointTemplate: 'https://{region}.contabostorage.com',\n\t\tregions: [\n\t\t\t{ code: 'eu2', label: 'European Union' },\n\t\t\t{ code: 'usc1', label: 'US Central' },\n\t\t\t{ code: 'sin1', label: 'Singapore' }\n\t\t],\n\t\tendpointPlaceholder: 'https://eu2.contabostorage.com',\n\t\tschemes: []\n\t},\n\n\thetzner: {\n\t\tlabel: 'Hetzner',\n\t\tdescription: 'Hetzner Object Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'fsn1',\n\t\tendpointTemplate: 'https://{region}.your-objectstorage.com',\n\t\tregions: [\n\t\t\t{ code: 'fsn1', label: 'Falkenstein, DE' },\n\t\t\t{ code: 'nbg1', label: 'Nuremberg, DE' },\n\t\t\t{ code: 'hel1', label: 'Helsinki, FI' }\n\t\t],\n\t\tendpointPlaceholder: 'https://fsn1.your-objectstorage.com',\n\t\tschemes: []\n\t},\n\n\tlinode: {\n\t\tlabel: 'Linode / Akamai',\n\t\tdescription: 'Akamai / Linode Object Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us-east-1',\n\t\tendpointTemplate: 'https://{region}.linodeobjects.com',\n\t\tregions: [\n\t\t\t{ code: 'us-east-1', label: 'Newark, NJ' },\n\t\t\t{ code: 'us-southeast-1', label: 'Atlanta, GA' },\n\t\t\t{ code: 'us-ord-1', label: 'Chicago, IL' },\n\t\t\t{ code: 'us-iad-1', label: 'Washington, DC' },\n\t\t\t{ code: 'us-lax-1', label: 'Los Angeles, CA' },\n\t\t\t{ code: 'us-sea-1', label: 'Seattle, WA' },\n\t\t\t{ code: 'us-mia-1', label: 'Miami, FL' },\n\t\t\t{ code: 'eu-central-1', label: 'Frankfurt, DE' },\n\t\t\t{ code: 'nl-ams-1', label: 'Amsterdam, NL' },\n\t\t\t{ code: 'gb-lon-1', label: 'London, UK' },\n\t\t\t{ code: 'fr-par-1', label: 'Paris, FR' },\n\t\t\t{ code: 'ap-south-1', label: 'Singapore' },\n\t\t\t{ code: 'jp-osa-1', label: 'Osaka, JP' },\n\t\t\t{ code: 'au-mel-1', label: 'Melbourne, AU' },\n\t\t\t{ code: 'br-gru-1', label: 'São Paulo, BR' },\n\t\t\t{ code: 'in-maa-1', label: 'Chennai, IN' },\n\t\t\t{ code: 'id-cgk-1', label: 'Jakarta, ID' },\n\t\t\t{ code: 'it-mil-1', label: 'Milan, IT' },\n\t\t\t{ code: 'se-sto-1', label: 'Stockholm, SE' }\n\t\t],\n\t\tendpointPlaceholder: 'https://us-east-1.linodeobjects.com',\n\t\tschemes: []\n\t},\n\n\tovhcloud: {\n\t\tlabel: 'OVHcloud',\n\t\tdescription: 'OVHcloud Object Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'gra',\n\t\tendpointTemplate: 'https://s3.{region}.io.cloud.ovh.net',\n\t\tregions: [\n\t\t\t{ code: 'gra', label: 'Gravelines, FR' },\n\t\t\t{ code: 'sbg', label: 'Strasbourg, FR' },\n\t\t\t{ code: 'bhs', label: 'Beauharnois, CA' },\n\t\t\t{ code: 'de', label: 'Frankfurt, DE' },\n\t\t\t{ code: 'uk', label: 'London, UK' },\n\t\t\t{ code: 'waw', label: 'Warsaw, PL' }\n\t\t],\n\t\tendpointPlaceholder: 'https://s3.gra.io.cloud.ovh.net',\n\t\tschemes: []\n\t}\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** All provider IDs, ordered for the UI. */\nexport const PROVIDER_IDS: ProviderId[] = [\n\t's3',\n\t'gcs',\n\t'r2',\n\t'azure',\n\t'b2',\n\t'digitalocean',\n\t'wasabi',\n\t'storj',\n\t'hetzner',\n\t'contabo',\n\t'linode',\n\t'ovhcloud',\n\t'minio'\n];\n\n/** Get provider def, falling back to S3 for unknown. */\nexport function getProvider(id: string): ProviderDef {\n\treturn PROVIDERS[id as ProviderId] ?? PROVIDERS.s3;\n}\n\n/** Build endpoint URL from template + region. */\nexport function buildEndpointFromTemplate(id: ProviderId, region: string): string {\n\tconst def = PROVIDERS[id];\n\tif (!def?.endpointTemplate) return '';\n\treturn def.endpointTemplate.replace('{region}', region);\n}\n\n/**\n * Build the base URL for API requests (endpoint + bucket).\n * Used by browser-cloud adapter and url-state.\n */\nexport function buildProviderBaseUrl(\n\tprovider: ProviderId,\n\tendpoint: string,\n\tbucket: string,\n\tregion: string\n): string {\n\tif (endpoint) {\n\t\treturn `${endpoint.replace(/\\/$/, '')}/${bucket}`;\n\t}\n\tconst def = PROVIDERS[provider];\n\tif (def?.endpointTemplate) {\n\t\tconst resolved = def.endpointTemplate.replace('{region}', region || def.defaultRegion);\n\t\treturn `${resolved}/${bucket}`;\n\t}\n\t// Fallback: AWS S3 path-style\n\treturn `https://s3.${region || 'us-east-1'}.amazonaws.com/${bucket}`;\n}\n\n/** Check if a provider uses the GCS JSON API (not S3 XML). */\nexport function isGcsProvider(provider: string, endpoint: string): boolean {\n\treturn provider === 'gcs' || (!!endpoint && /storage\\.googleapis\\.com/i.test(endpoint));\n}\n","/**\n * Universal cloud storage URL / bucket parser.\n *\n * Accepts the many URI/URL formats that users commonly paste and extracts\n * the correct bucket, region, endpoint, and provider.\n *\n * Supported URI schemes:\n * s3:// s3a:// s3n:// aws:// — Amazon S3 / S3-compatible\n * r2:// — Cloudflare R2\n * gs:// gcs:// — Google Cloud Storage\n * azure:// az:// — Azure Blob Storage\n * abfs:// abfss:// — Azure Data Lake (ADLS Gen2)\n * wasbs:// — Azure Blob (Hadoop WASB driver)\n * swift:// — OpenStack Swift\n * file:// filesystem:// — Local filesystem\n *\n * Supported HTTPS URL patterns:\n * https://<bucket>.s3.<region>.amazonaws.com[/prefix] — AWS virtual-hosted\n * https://s3.<region>.amazonaws.com/<bucket>[/prefix] — AWS path-style\n * https://s3.amazonaws.com/<bucket> — AWS global\n * https://<account>.r2.cloudflarestorage.com/<bucket> — Cloudflare R2\n * https://storage.googleapis.com/<bucket> — Google Cloud Storage\n * https://<bucket>.storage.googleapis.com[/prefix] — GCS virtual-hosted\n * https://<bucket>.<region>.digitaloceanspaces.com — DigitalOcean Spaces\n * https://<region>.digitaloceanspaces.com/<bucket> — DO Spaces path-style\n * https://s3.<region>.wasabisys.com/<bucket> — Wasabi\n * https://f<id>.backblazeb2.com/file/<bucket> — Backblaze B2\n * https://<bucket>.s3.<region>.backblazeb2.com — B2 S3-compatible\n * https://<bucket>.oss-<region>.aliyuncs.com — Alibaba Cloud OSS\n * https://<bucket>.cos.<region>.myqcloud.com — Tencent COS\n * https://storage.yandexcloud.net/<bucket> — Yandex Cloud\n * https://gateway.storjshare.io/<bucket> — Storj S3 gateway\n * https://link.storjshare.io/raw/<access>/<bucket> — Storj linksharing\n * https://<custom-endpoint>/<bucket> — Generic S3-compatible\n *\n * Also handles plain bucket names (no protocol).\n */\n\nimport { PROVIDERS } from '../storage/providers.js';\n\nexport type StorageProvider = string;\n\nexport interface ParsedStorageUrl {\n\tbucket: string;\n\tregion: string;\n\tendpoint: string;\n\tprovider: StorageProvider;\n\t/** Original prefix/path after bucket, if any */\n\tprefix: string;\n}\n\n/**\n * Build SCHEME_MAP from the provider registry's `schemes` arrays.\n * Each scheme like \"s3\" generates an entry `\"s3://\": { provider: \"s3\", strip: 5 }`.\n */\nfunction buildSchemeMap(): Record<string, { provider: StorageProvider; strip: number }> {\n\tconst map: Record<string, { provider: StorageProvider; strip: number }> = {};\n\tfor (const [id, def] of Object.entries(PROVIDERS)) {\n\t\tfor (const scheme of def.schemes) {\n\t\t\tconst key = `${scheme}://`;\n\t\t\tmap[key] = { provider: id, strip: key.length };\n\t\t}\n\t}\n\t// Non-registry schemes (no corresponding provider)\n\tmap['swift://'] = { provider: 'unknown', strip: 8 };\n\treturn map;\n}\n\n/** All recognized URI scheme prefixes (lowercase), derived from provider registry */\nconst SCHEME_MAP = buildSchemeMap();\n\nexport interface Defaults {\n\tregion?: string;\n\tendpoint?: string;\n\tprovider?: StorageProvider;\n}\n\nfunction defaultResult(defaults: Defaults): ParsedStorageUrl {\n\treturn {\n\t\tbucket: '',\n\t\tregion: defaults.region || 'us-east-1',\n\t\tendpoint: defaults.endpoint || '',\n\t\tprovider: defaults.provider || 's3',\n\t\tprefix: ''\n\t};\n}\n\nfunction splitBucketPrefix(rest: string): { bucket: string; prefix: string } {\n\tconst slashIdx = rest.indexOf('/');\n\tif (slashIdx >= 0) {\n\t\treturn {\n\t\t\tbucket: rest.slice(0, slashIdx),\n\t\t\tprefix: rest.slice(slashIdx + 1).replace(/\\/+$/, '')\n\t\t};\n\t}\n\treturn { bucket: rest, prefix: '' };\n}\n\n/**\n * Parse a user-provided bucket/URL string into structured storage connection parts.\n */\nexport function parseStorageUrl(input: string, defaults: Defaults = {}): ParsedStorageUrl {\n\tconst trimmed = input.trim();\n\n\t// ── Custom URI schemes (s3://, gs://, r2://, az://, etc.) ──────────\n\tconst lower = trimmed.toLowerCase();\n\tfor (const [scheme, { provider, strip }] of Object.entries(SCHEME_MAP)) {\n\t\tif (lower.startsWith(scheme)) {\n\t\t\tconst rest = trimmed.slice(strip);\n\t\t\tconst { bucket, prefix } = splitBucketPrefix(rest);\n\t\t\treturn {\n\t\t\t\tbucket,\n\t\t\t\tregion: defaults.region || 'us-east-1',\n\t\t\t\tendpoint: defaults.endpoint || '',\n\t\t\t\tprovider,\n\t\t\t\tprefix\n\t\t\t};\n\t\t}\n\t}\n\n\t// ── HTTP(S) URL ─────────────────────────────────────────────────\n\tif (lower.startsWith('http://') || lower.startsWith('https://')) {\n\t\ttry {\n\t\t\tconst url = new URL(trimmed);\n\t\t\tconst host = url.hostname;\n\t\t\tconst pathParts = url.pathname.replace(/^\\//, '').split('/').filter(Boolean);\n\n\t\t\t// --- AWS S3 ---\n\n\t\t\t// Virtual-hosted: <bucket>.s3.<region>.amazonaws.com\n\t\t\tconst awsVhost = host.match(/^(.+)\\.s3[.-]([a-z0-9-]+)\\.amazonaws\\.com$/);\n\t\t\tif (awsVhost) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: awsVhost[1],\n\t\t\t\t\tregion: awsVhost[2],\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Path-style: s3.<region>.amazonaws.com/<bucket>\n\t\t\tconst awsPath = host.match(/^s3[.-]([a-z0-9-]+)\\.amazonaws\\.com$/);\n\t\t\tif (awsPath && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: awsPath[1],\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Global: s3.amazonaws.com/<bucket>\n\t\t\tif (host === 's3.amazonaws.com' && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'us-east-1',\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Cloudflare R2 ---\n\t\t\t// <account>.r2.cloudflarestorage.com/<bucket>\n\t\t\tconst r2Match = host.match(/^([a-z0-9]+)\\.r2\\.cloudflarestorage\\.com$/);\n\t\t\tif (r2Match && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: 'auto',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'r2',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Google Cloud Storage ---\n\t\t\t// storage.googleapis.com/<bucket>\n\t\t\tif (host === 'storage.googleapis.com' && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'us',\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 'gcs',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// <bucket>.storage.googleapis.com\n\t\t\tconst gcsVhost = host.match(/^(.+)\\.storage\\.googleapis\\.com$/);\n\t\t\tif (gcsVhost) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: gcsVhost[1],\n\t\t\t\t\tregion: defaults.region || 'us',\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 'gcs',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- DigitalOcean Spaces ---\n\t\t\t// <bucket>.<region>.digitaloceanspaces.com\n\t\t\tconst doVhost = host.match(/^(.+)\\.([a-z0-9-]+)\\.digitaloceanspaces\\.com$/);\n\t\t\tif (doVhost) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: doVhost[1],\n\t\t\t\t\tregion: doVhost[2],\n\t\t\t\t\tendpoint: `${url.protocol}//${doVhost[2]}.digitaloceanspaces.com`,\n\t\t\t\t\tprovider: 'digitalocean',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// <region>.digitaloceanspaces.com/<bucket>\n\t\t\tconst doPath = host.match(/^([a-z0-9-]+)\\.digitaloceanspaces\\.com$/);\n\t\t\tif (doPath && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: doPath[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'digitalocean',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Wasabi ---\n\t\t\t// s3.<region>.wasabisys.com/<bucket>\n\t\t\tconst wasabiMatch = host.match(/^s3\\.([a-z0-9-]+)\\.wasabisys\\.com$/);\n\t\t\tif (wasabiMatch && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: wasabiMatch[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'wasabi',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Backblaze B2 ---\n\t\t\t// <bucket>.s3.<region>.backblazeb2.com (S3-compatible)\n\t\t\tconst b2S3 = host.match(/^(.+)\\.s3\\.([a-z0-9-]+)\\.backblazeb2\\.com$/);\n\t\t\tif (b2S3) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: b2S3[1],\n\t\t\t\t\tregion: b2S3[2],\n\t\t\t\t\tendpoint: `${url.protocol}//s3.${b2S3[2]}.backblazeb2.com`,\n\t\t\t\t\tprovider: 'b2',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// f<id>.backblazeb2.com/file/<bucket>\n\t\t\tconst b2Native = host.match(/^f[a-z0-9]+\\.backblazeb2\\.com$/);\n\t\t\tif (b2Native && pathParts[0] === 'file' && pathParts.length > 1) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[1],\n\t\t\t\t\tregion: defaults.region || 'us-west-000',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'b2',\n\t\t\t\t\tprefix: pathParts.slice(2).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Alibaba Cloud OSS ---\n\t\t\t// <bucket>.oss-<region>.aliyuncs.com\n\t\t\tconst ossMatch = host.match(/^(.+)\\.(oss-[a-z0-9-]+)\\.aliyuncs\\.com$/);\n\t\t\tif (ossMatch) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: ossMatch[1],\n\t\t\t\t\tregion: ossMatch[2],\n\t\t\t\t\tendpoint: `${url.protocol}//${ossMatch[2]}.aliyuncs.com`,\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Tencent Cloud COS ---\n\t\t\t// <bucket>.cos.<region>.myqcloud.com\n\t\t\tconst cosMatch = host.match(/^(.+)\\.cos\\.([a-z0-9-]+)\\.myqcloud\\.com$/);\n\t\t\tif (cosMatch) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: cosMatch[1],\n\t\t\t\t\tregion: cosMatch[2],\n\t\t\t\t\tendpoint: `${url.protocol}//cos.${cosMatch[2]}.myqcloud.com`,\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Yandex Cloud ---\n\t\t\t// storage.yandexcloud.net/<bucket>\n\t\t\tif (host === 'storage.yandexcloud.net' && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'ru-central1',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Contabo ---\n\t\t\t// <region>.contabostorage.com/<bucket>\n\t\t\tconst contaboMatch = host.match(/^([a-z0-9]+)\\.contabostorage\\.com$/);\n\t\t\tif (contaboMatch && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: contaboMatch[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'contabo',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Hetzner ---\n\t\t\t// <region>.your-objectstorage.com/<bucket>\n\t\t\tconst hetznerMatch = host.match(/^([a-z0-9]+)\\.your-objectstorage\\.com$/);\n\t\t\tif (hetznerMatch && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: hetznerMatch[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'hetzner',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Linode / Akamai ---\n\t\t\t// <bucket>.<region>.linodeobjects.com or <region>.linodeobjects.com/<bucket>\n\t\t\tconst linodeVhost = host.match(/^(.+)\\.([a-z0-9-]+)\\.linodeobjects\\.com$/);\n\t\t\tif (linodeVhost) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: linodeVhost[1],\n\t\t\t\t\tregion: linodeVhost[2],\n\t\t\t\t\tendpoint: `${url.protocol}//${linodeVhost[2]}.linodeobjects.com`,\n\t\t\t\t\tprovider: 'linode',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst linodePath = host.match(/^([a-z0-9-]+)\\.linodeobjects\\.com$/);\n\t\t\tif (linodePath && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: linodePath[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'linode',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- OVHcloud ---\n\t\t\t// s3.<region>.io.cloud.ovh.net/<bucket>\n\t\t\tconst ovhMatch = host.match(/^s3\\.([a-z0-9-]+)\\.io\\.cloud\\.ovh\\.(?:net|us)$/);\n\t\t\tif (ovhMatch && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: ovhMatch[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'ovhcloud',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- MinIO ---\n\t\t\t// Common patterns: minio.<domain>, localhost with port\n\t\t\tconst isMinioLike =\n\t\t\t\thost.includes('minio') ||\n\t\t\t\thost === 'localhost' ||\n\t\t\t\thost === '127.0.0.1' ||\n\t\t\t\thost.startsWith('192.168.') ||\n\t\t\t\thost.startsWith('10.');\n\t\t\tif (isMinioLike && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'us-east-1',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'minio',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Azure Blob Storage ---\n\t\t\t// <account>.blob.core.windows.net/<container>\n\t\t\tconst azureBlob = host.match(/^([a-z0-9]+)\\.blob\\.core\\.windows\\.net$/);\n\t\t\tif (azureBlob && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || '',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'azure',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Storj ---\n\t\t\t// S3 gateway: gateway.storjshare.io/<bucket> (or gateway.<region>.storjshare.io)\n\t\t\tconst storjGateway = host.match(/^gateway\\.(?:([a-z0-9]+)\\.)?storjshare\\.io$/);\n\t\t\tif (storjGateway && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: storjGateway[1] || defaults.region || 'us1',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'storj',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Linksharing: link.storjshare.io/raw/<access>/<bucket>/... or /s/<access>/<bucket>/...\n\t\t\tconst storjLink = host.match(/^link\\.(?:([a-z0-9]+)\\.)?storjshare\\.io$/);\n\t\t\tif (storjLink && pathParts.length >= 3 && (pathParts[0] === 'raw' || pathParts[0] === 's')) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[2],\n\t\t\t\t\tregion: storjLink[1] || defaults.region || 'us1',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}/${pathParts[0]}/${pathParts[1]}`,\n\t\t\t\t\tprovider: 'storj',\n\t\t\t\t\tprefix: pathParts.slice(3).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Generic custom endpoint with bucket in path ---\n\t\t\tif (pathParts.length > 0) {\n\t\t\t\tconst endpoint = `${url.protocol}//${url.host}`;\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'us-east-1',\n\t\t\t\t\tendpoint,\n\t\t\t\t\tprovider: defaults.provider || 's3',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Just a host, no path — treat as endpoint with no bucket\n\t\t\treturn {\n\t\t\t\t...defaultResult(defaults),\n\t\t\t\tendpoint: `${url.protocol}//${url.host}`\n\t\t\t};\n\t\t} catch {\n\t\t\t// Not a valid URL, fall through to plain bucket name\n\t\t}\n\t}\n\n\t// ── Plain bucket name (no protocol) ─────────────────────────────\n\tconst cleaned = trimmed.replace(/^\\/+|\\/+$/g, '');\n\treturn {\n\t\tbucket: cleaned,\n\t\tregion: defaults.region || 'us-east-1',\n\t\tendpoint: defaults.endpoint || '',\n\t\tprovider: defaults.provider || 's3',\n\t\tprefix: ''\n\t};\n}\n\n/**\n * Returns true if the input looks like a URL/URI rather than a plain bucket name.\n * Covers all recognized cloud storage URI schemes.\n */\nexport function looksLikeUrl(input: string): boolean {\n\tconst lower = input.trim().toLowerCase();\n\tif (lower.startsWith('http://') || lower.startsWith('https://')) return true;\n\tfor (const scheme of Object.keys(SCHEME_MAP)) {\n\t\tif (lower.startsWith(scheme)) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Given a parsed URL result, build a human-readable summary of what was detected.\n */\nexport function describeParseResult(parsed: ParsedStorageUrl): string {\n\tconst parts: string[] = [];\n\tif (parsed.bucket) parts.push(`bucket=\"${parsed.bucket}\"`);\n\tif (parsed.endpoint) parts.push(`endpoint=\"${parsed.endpoint}\"`);\n\tif (parsed.region && parsed.region !== 'us-east-1') parts.push(`region=\"${parsed.region}\"`);\n\tif (parsed.provider !== 's3') parts.push(`provider=${parsed.provider}`);\n\tif (parsed.prefix) parts.push(`prefix=\"${parsed.prefix}\"`);\n\treturn parts.length > 0 ? `Detected: ${parts.join(', ')}` : '';\n}\n","/**\n * Lightweight WKB (Well-Known Binary) parser for extracting coordinates.\n * Supports Point, LineString, Polygon, and Multi* variants.\n * Handles standard WKB, ISO WKB (with Z/M), and EWKB (PostGIS SRID).\n */\n\nexport type GeoType =\n\t| 'Point'\n\t| 'LineString'\n\t| 'Polygon'\n\t| 'MultiPoint'\n\t| 'MultiLineString'\n\t| 'MultiPolygon'\n\t| 'Unknown';\n\nexport interface ParsedGeometry {\n\ttype: GeoType;\n\tcoordinates: number[] | number[][] | number[][][] | number[][][][];\n}\n\n// WKB type codes\nconst WKB_POINT = 1;\nconst WKB_LINESTRING = 2;\nconst WKB_POLYGON = 3;\nconst WKB_MULTIPOINT = 4;\nconst WKB_MULTILINESTRING = 5;\nconst WKB_MULTIPOLYGON = 6;\n\n// EWKB flags\nconst EWKB_Z_FLAG = 0x80000000;\nconst EWKB_M_FLAG = 0x40000000;\nconst EWKB_SRID_FLAG = 0x20000000;\n\n/**\n * Normalize binary data from various formats to Uint8Array.\n * Handles Uint8Array, ArrayBuffer, number arrays, hex strings,\n * and DuckDB toJSON() blob objects ({0: byte, 1: byte, ...}).\n */\nexport function toBinary(value: unknown): Uint8Array | null {\n\tif (value === null || value === undefined) return null;\n\tif (value instanceof Uint8Array) return value;\n\tif (value instanceof ArrayBuffer) return new Uint8Array(value);\n\tif (Array.isArray(value) && value.length > 0 && typeof value[0] === 'number') {\n\t\treturn new Uint8Array(value);\n\t}\n\tif (typeof value === 'string' && /^[0-9a-fA-F]+$/.test(value) && value.length % 2 === 0) {\n\t\tconst bytes = new Uint8Array(value.length / 2);\n\t\tfor (let i = 0; i < value.length; i += 2) {\n\t\t\tbytes[i / 2] = parseInt(value.substring(i, i + 2), 16);\n\t\t}\n\t\treturn bytes;\n\t}\n\t// DuckDB toJSON() serializes BLOB/GEOMETRY as {\"0\": byte, \"1\": byte, ...}\n\tif (typeof value === 'object' && !Array.isArray(value)) {\n\t\tconst obj = value as Record<string, number>;\n\t\tconst keys = Object.keys(obj);\n\t\tif (keys.length > 4 && typeof obj['0'] === 'number') {\n\t\t\tconst arr = new Uint8Array(keys.length);\n\t\t\tfor (let i = 0; i < keys.length; i++) arr[i] = obj[i];\n\t\t\treturn arr;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Parse a WKB binary blob into coordinates and geometry type.\n */\nexport function parseWKB(data: Uint8Array): ParsedGeometry | null {\n\tif (data.length < 5) return null;\n\ttry {\n\t\treturn readGeometry(new DataView(data.buffer, data.byteOffset, data.byteLength), 0).geometry;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction readGeometry(\n\tview: DataView,\n\toffset: number\n): { geometry: ParsedGeometry; offset: number } {\n\tconst le = view.getUint8(offset) === 1;\n\toffset += 1;\n\n\tlet typeInt = view.getUint32(offset, le);\n\toffset += 4;\n\n\t// Detect coordinate dimensions from EWKB flags or ISO type ranges\n\tconst hasZ =\n\t\t(typeInt & EWKB_Z_FLAG) !== 0 ||\n\t\t(typeInt % 10000 >= 1000 && typeInt % 10000 < 2000) ||\n\t\t(typeInt % 10000 >= 3000 && typeInt % 10000 < 4000);\n\tconst hasM =\n\t\t(typeInt & EWKB_M_FLAG) !== 0 ||\n\t\t(typeInt % 10000 >= 2000 && typeInt % 10000 < 3000) ||\n\t\t(typeInt % 10000 >= 3000 && typeInt % 10000 < 4000);\n\n\t// Skip SRID if present (EWKB)\n\tif (typeInt & EWKB_SRID_FLAG) offset += 4;\n\n\t// Strip all flags to get base geometry type\n\ttypeInt = (typeInt & 0x0000ffff) % 1000;\n\n\tconst extraDims = (hasZ ? 1 : 0) + (hasM ? 1 : 0);\n\tconst rd = (o: number) => view.getFloat64(o, le);\n\tconst ru = (o: number) => view.getUint32(o, le);\n\n\tfunction readPoint(off: number): { coords: number[]; offset: number } {\n\t\tconst x = rd(off);\n\t\tconst y = rd(off + 8);\n\t\treturn { coords: [x, y], offset: off + 16 + extraDims * 8 };\n\t}\n\n\tfunction readLineString(off: number): { coords: number[][]; offset: number } {\n\t\tconst n = ru(off);\n\t\toff += 4;\n\t\tconst coords: number[][] = [];\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tconst pt = readPoint(off);\n\t\t\tcoords.push(pt.coords);\n\t\t\toff = pt.offset;\n\t\t}\n\t\treturn { coords, offset: off };\n\t}\n\n\tfunction readPolygon(off: number): { coords: number[][][]; offset: number } {\n\t\tconst n = ru(off);\n\t\toff += 4;\n\t\tconst coords: number[][][] = [];\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tconst ring = readLineString(off);\n\t\t\tcoords.push(ring.coords);\n\t\t\toff = ring.offset;\n\t\t}\n\t\treturn { coords, offset: off };\n\t}\n\n\tswitch (typeInt) {\n\t\tcase WKB_POINT: {\n\t\t\tconst pt = readPoint(offset);\n\t\t\treturn { geometry: { type: 'Point', coordinates: pt.coords }, offset: pt.offset };\n\t\t}\n\t\tcase WKB_LINESTRING: {\n\t\t\tconst ls = readLineString(offset);\n\t\t\treturn { geometry: { type: 'LineString', coordinates: ls.coords }, offset: ls.offset };\n\t\t}\n\t\tcase WKB_POLYGON: {\n\t\t\tconst pg = readPolygon(offset);\n\t\t\treturn { geometry: { type: 'Polygon', coordinates: pg.coords }, offset: pg.offset };\n\t\t}\n\t\tcase WKB_MULTIPOINT: {\n\t\t\tconst n = ru(offset);\n\t\t\toffset += 4;\n\t\t\tconst coords: number[][] = [];\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tconst r = readGeometry(view, offset);\n\t\t\t\tcoords.push(r.geometry.coordinates as number[]);\n\t\t\t\toffset = r.offset;\n\t\t\t}\n\t\t\treturn { geometry: { type: 'MultiPoint', coordinates: coords }, offset };\n\t\t}\n\t\tcase WKB_MULTILINESTRING: {\n\t\t\tconst n = ru(offset);\n\t\t\toffset += 4;\n\t\t\tconst coords: number[][][] = [];\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tconst r = readGeometry(view, offset);\n\t\t\t\tcoords.push(r.geometry.coordinates as number[][]);\n\t\t\t\toffset = r.offset;\n\t\t\t}\n\t\t\treturn { geometry: { type: 'MultiLineString', coordinates: coords }, offset };\n\t\t}\n\t\tcase WKB_MULTIPOLYGON: {\n\t\t\tconst n = ru(offset);\n\t\t\toffset += 4;\n\t\t\tconst coords: number[][][][] = [];\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tconst r = readGeometry(view, offset);\n\t\t\t\tcoords.push(r.geometry.coordinates as number[][][]);\n\t\t\t\toffset = r.offset;\n\t\t\t}\n\t\t\treturn { geometry: { type: 'MultiPolygon', coordinates: coords }, offset };\n\t\t}\n\t\tdefault:\n\t\t\treturn { geometry: { type: 'Unknown', coordinates: [] }, offset };\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Geometry column detection\n// ---------------------------------------------------------------------------\n\n/** Exact well-known geometry column names (lowercase for comparison). */\nconst GEO_NAMES = [\n\t'geometry',\n\t'geom',\n\t'wkb_geometry',\n\t'the_geom',\n\t'shape',\n\t'geo',\n\t'wkt_geometry',\n\t'the_geog',\n\t'geog',\n\t'way',\n\t'ora_geometry'\n];\n\n/** Type keywords that indicate a geometry column. */\nconst GEO_TYPE_KEYWORDS = [\n\t'geometry',\n\t'geography',\n\t'wkb',\n\t'point',\n\t'linestring',\n\t'polygon',\n\t'multipoint',\n\t'multilinestring',\n\t'multipolygon',\n\t'geometrycollection',\n\t'sdo_geometry'\n];\n\n/** Substrings in column names that hint at geometry content. */\nconst GEO_NAME_HINTS = ['geom', 'geometry', 'geo_', '_geo', 'wkb', 'wkt', 'shape', 'spatial'];\n\n/** Valid GeoJSON geometry type names. */\nconst GEOJSON_TYPES = [\n\t'Point',\n\t'LineString',\n\t'Polygon',\n\t'MultiPoint',\n\t'MultiLineString',\n\t'MultiPolygon'\n];\n\n/** Check if a value is a GeoJSON geometry object ({type, coordinates}). */\nfunction isGeoJSONGeometry(value: unknown): value is { type: GeoType; coordinates: unknown } {\n\tif (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\tconst obj = value as Record<string, unknown>;\n\treturn (\n\t\ttypeof obj.type === 'string' && GEOJSON_TYPES.includes(obj.type) && obj.coordinates != null\n\t);\n}\n\n/**\n * Find the geometry column name from a schema.\n *\n * Detection priority:\n * 1. Column type contains a geometry keyword (GEOMETRY, POINT, WKB, etc.)\n * 2. Exact well-known column name with BLOB/BINARY type\n * 3. Exact well-known column name regardless of type\n * 4. Column name contains a geo-related substring with BLOB/BINARY type\n * 5. Column name contains a geo-related substring regardless of type\n */\nexport function findGeoColumn(schema: { name: string; type: string }[]): string | null {\n\t// Priority 1: column type contains a geometry keyword\n\t// Skip STRUCT/MAP/LIST types — their field names can false-positive\n\t// (e.g. STRUCT(... Geometry VARCHAR ...) matches 'geometry')\n\tfor (const f of schema) {\n\t\tconst t = f.type.toLowerCase();\n\t\tif (t.startsWith('struct') || t.startsWith('map') || t.startsWith('list')) continue;\n\t\tif (GEO_TYPE_KEYWORDS.some((kw) => t.includes(kw))) return f.name;\n\t}\n\n\t// Priority 2: exact well-known name with binary type\n\tfor (const f of schema) {\n\t\tconst n = f.name.toLowerCase();\n\t\tconst t = f.type.toLowerCase();\n\t\tconst isBinary = t.includes('blob') || t.includes('binary') || t.includes('bytea');\n\t\tif (GEO_NAMES.includes(n) && isBinary) return f.name;\n\t}\n\n\t// Priority 3: exact well-known name, any type\n\tfor (const f of schema) {\n\t\tif (GEO_NAMES.includes(f.name.toLowerCase())) return f.name;\n\t}\n\n\t// Priority 4: name contains geo hint with binary type\n\tfor (const f of schema) {\n\t\tconst n = f.name.toLowerCase();\n\t\tconst t = f.type.toLowerCase();\n\t\tconst isBinary = t.includes('blob') || t.includes('binary') || t.includes('bytea');\n\t\tif (isBinary && GEO_NAME_HINTS.some((hint) => n.includes(hint))) return f.name;\n\t}\n\n\t// Priority 5: name contains geo hint, any type\n\tfor (const f of schema) {\n\t\tconst n = f.name.toLowerCase();\n\t\tif (GEO_NAME_HINTS.some((hint) => n.includes(hint))) return f.name;\n\t}\n\n\treturn null;\n}\n\n/**\n * Check if a value looks like valid WKB by inspecting its first bytes.\n * WKB starts with a byte-order marker (0x00 big-endian, 0x01 little-endian)\n * followed by a uint32 geometry type code.\n */\nfunction looksLikeWKB(value: unknown): boolean {\n\tconst bytes = toBinary(value);\n\tif (!bytes || bytes.length < 5) return false;\n\n\tconst bom = bytes[0];\n\tif (bom !== 0x00 && bom !== 0x01) return false;\n\n\tconst le = bom === 0x01;\n\tconst view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\tlet typeInt = view.getUint32(1, le);\n\n\t// Strip EWKB flags\n\ttypeInt = (typeInt & 0x0000ffff) % 1000;\n\n\t// Valid base geometry types are 1–7\n\treturn typeInt >= 1 && typeInt <= 7;\n}\n\n/**\n * Fallback: probe actual row data to find a column containing WKB geometry.\n * Use this when schema-only detection via `findGeoColumn()` returns null.\n * Samples the first row and checks each BLOB/binary column for WKB magic bytes.\n */\nexport function findGeoColumnFromRows(\n\trows: Record<string, unknown>[],\n\tschema: { name: string; type: string }[]\n): string | null {\n\tif (rows.length === 0) return null;\n\n\tconst sample = rows[0];\n\n\t// First pass: check binary-typed columns\n\tfor (const f of schema) {\n\t\tconst t = f.type.toLowerCase();\n\t\tconst isBinary = t.includes('blob') || t.includes('binary') || t.includes('bytea');\n\t\tif (isBinary && looksLikeWKB(sample[f.name])) return f.name;\n\t}\n\n\t// Second pass: check any column that holds binary-like data or WKT strings\n\tfor (const [key, value] of Object.entries(sample)) {\n\t\tif (value instanceof Uint8Array || value instanceof ArrayBuffer) {\n\t\t\tif (looksLikeWKB(value)) return key;\n\t\t}\n\t\tif (typeof value === 'string') {\n\t\t\t// Hex-encoded WKB\n\t\t\tif (/^[0-9a-fA-F]+$/.test(value) && value.length >= 10 && looksLikeWKB(value)) {\n\t\t\t\treturn key;\n\t\t\t}\n\t\t\t// WKT string (from DuckDB spatial GEOMETRY type)\n\t\t\tif (isWKT(value)) return key;\n\t\t}\n\t\t// GeoJSON geometry object (from DuckDB read_json_auto struct serialization)\n\t\tif (isGeoJSONGeometry(value)) return key;\n\t\t// GeoJSON JSON string (from DuckDB to_json()::VARCHAR)\n\t\tif (typeof value === 'string' && value.startsWith('{')) {\n\t\t\ttry {\n\t\t\t\tif (isGeoJSONGeometry(JSON.parse(value))) return key;\n\t\t\t} catch {\n\t\t\t\t// not JSON\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\n// ---------------------------------------------------------------------------\n// WKT detection (used by findGeoColumnFromRows for column sniffing)\n// ---------------------------------------------------------------------------\n\nconst WKT_TYPES = [\n\t'POINT',\n\t'LINESTRING',\n\t'POLYGON',\n\t'MULTIPOINT',\n\t'MULTILINESTRING',\n\t'MULTIPOLYGON'\n];\n\n/** Check if a string looks like WKT. */\nfunction isWKT(value: unknown): value is string {\n\tif (typeof value !== 'string') return false;\n\tconst s = value.trimStart().toUpperCase();\n\treturn WKT_TYPES.some((t) => s.startsWith(t) || s.startsWith(`MULTI${t}`));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/constants.ts","../../../src/lib/file-icons/index.ts","../../../src/lib/query/engine.ts","../../../src/lib/storage/providers.ts","../../../src/lib/storage/url-adapter.ts","../../../src/lib/utils/cloud-url.ts","../../../src/lib/utils/column-types.ts","../../../src/lib/utils/error.ts","../../../src/lib/utils/format.ts","../../../src/lib/utils/export.ts","../../../src/lib/utils/file-sort.ts","../../../src/lib/utils/geoarrow.ts","../../../src/lib/utils/hex.ts","../../../src/lib/utils/local-storage.ts","../../../src/lib/utils/markdown-sql.ts","../../../src/lib/utils/parquet-metadata.ts","../../../src/lib/utils/storage-url.ts","../../../src/lib/utils/wkb.ts"],"names":["ext","globalBounds"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared constants used across the application.\n * Centralizes magic strings, numbers, and sets to prevent duplication.\n */\n\n// ── localStorage keys ──\n\nexport const STORAGE_KEYS = {\n\tSETTINGS: 'obstore-explore-settings',\n\tCONNECTIONS: 'obstore-explore-connections',\n\tQUERY_HISTORY: 'obstore-explore-query-history'\n} as const;\n\n// ── Geo / CRS constants ──\n\n/** EPSG codes considered WGS84 (no reprojection needed). */\nexport const WGS84_CODES = new Set([4326, 4979]);\n\n/** Default target CRS for ST_Transform. */\nexport const DEFAULT_TARGET_CRS = 'EPSG:4326';\n\n// ── Query engine constants ──\n\n/** DuckDB-WASM initialization timeout in ms. */\nexport const DUCKDB_INIT_TIMEOUT_MS = 30_000;\n\n/** Maximum entries kept in query history. */\nexport const MAX_QUERY_HISTORY_ENTRIES = 200;\n\n/** SQL preview truncation length (characters). */\nexport const SQL_PREVIEW_LENGTH = 120;\n\n// ── File browser constants ──\n\n/** Extensions that represent \"virtual files\" — directories that open as viewers. */\nexport const VIEWER_DIR_EXTENSIONS = new Set(['zarr', 'zr3']);\n\n// ── PMTiles ──\n\n/**\n * Golden-angle-based hue multiplier for evenly distributing layer colors.\n * 137 ≈ 360 × (1 − 1/φ) where φ is the golden ratio.\n */\nexport const LAYER_HUE_MULTIPLIER = 137;\n\n// ── Clipboard ──\n\n/** Duration (ms) to show \"Copied!\" feedback before resetting. */\nexport const COPY_FEEDBACK_MS = 2000;\n","/**\n * Centralized file type detection module.\n *\n * Single source of truth for extension → icon, color, label, category,\n * viewer, DuckDB read function, MIME type, and queryability.\n *\n * Used by: FileRow, FileTreeSidebar, ViewerRouter, TableViewer, WasmQueryEngine, etc.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type FileCategory =\n\t| 'data'\n\t| 'geo'\n\t| 'code'\n\t| 'document'\n\t| 'config'\n\t| 'image'\n\t| 'video'\n\t| 'audio'\n\t| 'archive'\n\t| 'database'\n\t| '3d'\n\t| 'other';\n\nexport type ViewerKind =\n\t| 'table'\n\t| 'image'\n\t| 'video'\n\t| 'audio'\n\t| 'markdown'\n\t| 'code'\n\t| 'cog'\n\t| 'pmtiles'\n\t| 'flatgeobuf'\n\t| 'pdf'\n\t| '3d'\n\t| 'archive'\n\t| 'database'\n\t| 'zarr'\n\t| 'copc'\n\t| 'notebook'\n\t| 'raw';\n\nexport type DuckDbReadFn = 'read_parquet' | 'read_csv' | 'read_json' | 'ST_Read';\n\nexport interface FileTypeInfo {\n\t/** Lucide icon name */\n\ticon: string;\n\t/** Tailwind color classes (light + dark) */\n\tcolor: string;\n\t/** Human-readable type label, e.g. \"Apache Parquet\" */\n\tlabel: string;\n\t/** High-level category */\n\tcategory: FileCategory;\n\t/** Which viewer component to use */\n\tviewer: ViewerKind;\n\t/** Whether this file can be queried with DuckDB */\n\tqueryable: boolean;\n\t/** DuckDB read function (null if not queryable) */\n\tduckdbReadFn: DuckDbReadFn | null;\n\t/** MIME type */\n\tmimeType: string;\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_INFO: FileTypeInfo = {\n\ticon: 'File',\n\tcolor: 'text-zinc-400 dark:text-zinc-500',\n\tlabel: 'File',\n\tcategory: 'other',\n\tviewer: 'raw',\n\tqueryable: false,\n\tduckdbReadFn: null,\n\tmimeType: 'application/octet-stream'\n};\n\nconst FOLDER_INFO: FileTypeInfo = {\n\ticon: 'Folder',\n\tcolor: 'text-blue-500 dark:text-blue-400',\n\tlabel: 'Folder',\n\tcategory: 'other',\n\tviewer: 'raw',\n\tqueryable: false,\n\tduckdbReadFn: null,\n\tmimeType: 'inode/directory'\n};\n\n// ---------------------------------------------------------------------------\n// Extension registry\n// ---------------------------------------------------------------------------\n\nconst EXTENSIONS: Record<string, FileTypeInfo> = {\n\t// ── Data / Tabular ──────────────────────────────────────────────────\n\t'.parquet': {\n\t\ticon: 'Columns3',\n\t\tcolor: 'text-purple-600 dark:text-purple-400',\n\t\tlabel: 'Apache Parquet',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_parquet',\n\t\tmimeType: 'application/vnd.apache.parquet'\n\t},\n\t'.geoparquet': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'GeoParquet',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_parquet',\n\t\tmimeType: 'application/vnd.apache.parquet'\n\t},\n\t'.gpq': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'GeoParquet',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_parquet',\n\t\tmimeType: 'application/vnd.apache.parquet'\n\t},\n\t'.gparquet': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'GeoParquet',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_parquet',\n\t\tmimeType: 'application/vnd.apache.parquet'\n\t},\n\t'.csv': {\n\t\ticon: 'Table',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'CSV',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_csv',\n\t\tmimeType: 'text/csv'\n\t},\n\t'.tsv': {\n\t\ticon: 'Table',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'TSV',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_csv',\n\t\tmimeType: 'text/tab-separated-values'\n\t},\n\t'.json': {\n\t\ticon: 'Braces',\n\t\tcolor: 'text-yellow-600 dark:text-yellow-400',\n\t\tlabel: 'JSON',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/json'\n\t},\n\t'.jsonl': {\n\t\ticon: 'Braces',\n\t\tcolor: 'text-yellow-500 dark:text-yellow-400',\n\t\tlabel: 'JSON Lines',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_json',\n\t\tmimeType: 'application/x-jsonlines'\n\t},\n\t'.ndjson': {\n\t\ticon: 'Braces',\n\t\tcolor: 'text-yellow-500 dark:text-yellow-400',\n\t\tlabel: 'NDJSON',\n\t\tcategory: 'data',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_json',\n\t\tmimeType: 'application/x-ndjson'\n\t},\n\t'.geojson': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-emerald-600 dark:text-emerald-400',\n\t\tlabel: 'GeoJSON',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'read_json',\n\t\tmimeType: 'application/geo+json'\n\t},\n\t'.arrow': {\n\t\ticon: 'Zap',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'Apache Arrow',\n\t\tcategory: 'data',\n\t\tviewer: 'raw',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/vnd.apache.arrow.file'\n\t},\n\t'.feather': {\n\t\ticon: 'Zap',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'Feather',\n\t\tcategory: 'data',\n\t\tviewer: 'raw',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/vnd.apache.arrow.file'\n\t},\n\t'.ipc': {\n\t\ticon: 'Zap',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'Arrow IPC',\n\t\tcategory: 'data',\n\t\tviewer: 'raw',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/vnd.apache.arrow.stream'\n\t},\n\n\t// ── Images ──────────────────────────────────────────────────────────\n\t'.png': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'PNG Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/png'\n\t},\n\t'.jpg': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'JPEG Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/jpeg'\n\t},\n\t'.jpeg': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'JPEG Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/jpeg'\n\t},\n\t'.gif': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'GIF Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/gif'\n\t},\n\t'.webp': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'WebP Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/webp'\n\t},\n\t'.avif': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'AVIF Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/avif'\n\t},\n\t'.svg': {\n\t\ticon: 'Palette',\n\t\tcolor: 'text-pink-600 dark:text-pink-400',\n\t\tlabel: 'SVG',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/svg+xml'\n\t},\n\t'.bmp': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'BMP Image',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/bmp'\n\t},\n\t'.ico': {\n\t\ticon: 'Image',\n\t\tcolor: 'text-pink-500 dark:text-pink-400',\n\t\tlabel: 'Icon',\n\t\tcategory: 'image',\n\t\tviewer: 'image',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/x-icon'\n\t},\n\n\t// ── Video ───────────────────────────────────────────────────────────\n\t'.mp4': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'MP4 Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/mp4'\n\t},\n\t'.webm': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'WebM Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/webm'\n\t},\n\t'.mov': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'MOV Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/quicktime'\n\t},\n\t'.avi': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'AVI Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/x-msvideo'\n\t},\n\t'.mkv': {\n\t\ticon: 'Film',\n\t\tcolor: 'text-violet-500 dark:text-violet-400',\n\t\tlabel: 'MKV Video',\n\t\tcategory: 'video',\n\t\tviewer: 'video',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'video/x-matroska'\n\t},\n\n\t// ── Audio ───────────────────────────────────────────────────────────\n\t'.mp3': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'MP3 Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/mpeg'\n\t},\n\t'.wav': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'WAV Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/wav'\n\t},\n\t'.ogg': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'OGG Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/ogg'\n\t},\n\t'.flac': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'FLAC Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/flac'\n\t},\n\t'.aac': {\n\t\ticon: 'Music',\n\t\tcolor: 'text-rose-500 dark:text-rose-400',\n\t\tlabel: 'AAC Audio',\n\t\tcategory: 'audio',\n\t\tviewer: 'audio',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'audio/aac'\n\t},\n\n\t// ── Code ────────────────────────────────────────────────────────────\n\t'.py': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-sky-600 dark:text-sky-400',\n\t\tlabel: 'Python',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-python'\n\t},\n\t'.ts': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-600 dark:text-blue-400',\n\t\tlabel: 'TypeScript',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/typescript'\n\t},\n\t'.js': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-yellow-500 dark:text-yellow-400',\n\t\tlabel: 'JavaScript',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/javascript'\n\t},\n\t'.rs': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-orange-700 dark:text-orange-400',\n\t\tlabel: 'Rust',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-rust'\n\t},\n\t'.go': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-cyan-600 dark:text-cyan-400',\n\t\tlabel: 'Go',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-go'\n\t},\n\t'.java': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-red-600 dark:text-red-400',\n\t\tlabel: 'Java',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-java'\n\t},\n\t'.c': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'C',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-c'\n\t},\n\t'.cpp': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'C++',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-c++'\n\t},\n\t'.h': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'C Header',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-c'\n\t},\n\t'.hpp': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'C++ Header',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-c++'\n\t},\n\t'.rb': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-red-500 dark:text-red-400',\n\t\tlabel: 'Ruby',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-ruby'\n\t},\n\t'.php': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-indigo-500 dark:text-indigo-400',\n\t\tlabel: 'PHP',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-php'\n\t},\n\t'.swift': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'Swift',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-swift'\n\t},\n\t'.kt': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'Kotlin',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-kotlin'\n\t},\n\t'.scala': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-red-600 dark:text-red-400',\n\t\tlabel: 'Scala',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-scala'\n\t},\n\t'.r': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-600 dark:text-blue-400',\n\t\tlabel: 'R',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-r'\n\t},\n\t'.lua': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-800 dark:text-blue-400',\n\t\tlabel: 'Lua',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-lua'\n\t},\n\t'.html': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-orange-600 dark:text-orange-400',\n\t\tlabel: 'HTML',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/html'\n\t},\n\t'.css': {\n\t\ticon: 'Paintbrush',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'CSS',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/css'\n\t},\n\t'.sql': {\n\t\ticon: 'DatabaseZap',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'SQL',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-sql'\n\t},\n\t'.sh': {\n\t\ticon: 'Terminal',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'Shell Script',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-shellscript'\n\t},\n\t'.bash': {\n\t\ticon: 'Terminal',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'Bash Script',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/x-shellscript'\n\t},\n\t'.vim': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-green-700 dark:text-green-400',\n\t\tlabel: 'Vim Script',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.dockerfile': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-blue-600 dark:text-blue-400',\n\t\tlabel: 'Dockerfile',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.makefile': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-orange-600 dark:text-orange-400',\n\t\tlabel: 'Makefile',\n\t\tcategory: 'code',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\n\t// ── Documents ───────────────────────────────────────────────────────\n\t'.md': {\n\t\ticon: 'BookText',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'Markdown',\n\t\tcategory: 'document',\n\t\tviewer: 'markdown',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/markdown'\n\t},\n\t'.markdown': {\n\t\ticon: 'BookText',\n\t\tcolor: 'text-blue-500 dark:text-blue-400',\n\t\tlabel: 'Markdown',\n\t\tcategory: 'document',\n\t\tviewer: 'markdown',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/markdown'\n\t},\n\t'.pdf': {\n\t\ticon: 'FileText',\n\t\tcolor: 'text-red-600 dark:text-red-400',\n\t\tlabel: 'PDF',\n\t\tcategory: 'document',\n\t\tviewer: 'pdf',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/pdf'\n\t},\n\t'.txt': {\n\t\ticon: 'FileText',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Text',\n\t\tcategory: 'document',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.log': {\n\t\ticon: 'FileText',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Log File',\n\t\tcategory: 'document',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\n\t// ── Config ──────────────────────────────────────────────────────────\n\t'.xml': {\n\t\ticon: 'FileCode',\n\t\tcolor: 'text-orange-500 dark:text-orange-400',\n\t\tlabel: 'XML',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/xml'\n\t},\n\t'.yaml': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'YAML',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/yaml'\n\t},\n\t'.yml': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'YAML',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/yaml'\n\t},\n\t'.toml': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'TOML',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.ini': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'INI',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.cfg': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Config',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.conf': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Config',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.env': {\n\t\ticon: 'Settings',\n\t\tcolor: 'text-zinc-500 dark:text-zinc-400',\n\t\tlabel: 'Environment',\n\t\tcategory: 'config',\n\t\tviewer: 'code',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\n\t// ── Archives ────────────────────────────────────────────────────────\n\t'.zip': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'ZIP Archive',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/zip'\n\t},\n\t'.tar': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'TAR Archive',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-tar'\n\t},\n\t'.gz': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'GZIP',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/gzip'\n\t},\n\t'.tgz': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'TGZ Archive',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/gzip'\n\t},\n\t'.7z': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: '7-Zip',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-7z-compressed'\n\t},\n\t'.rar': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'RAR',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/vnd.rar'\n\t},\n\t'.bz2': {\n\t\ticon: 'Archive',\n\t\tcolor: 'text-amber-600 dark:text-amber-400',\n\t\tlabel: 'BZIP2',\n\t\tcategory: 'archive',\n\t\tviewer: 'archive',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-bzip2'\n\t},\n\n\t// ── Geo / Map ───────────────────────────────────────────────────────\n\t'.tif': {\n\t\ticon: 'Map',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'GeoTIFF',\n\t\tcategory: 'geo',\n\t\tviewer: 'cog',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/tiff'\n\t},\n\t'.tiff': {\n\t\ticon: 'Map',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'GeoTIFF',\n\t\tcategory: 'geo',\n\t\tviewer: 'cog',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'image/tiff'\n\t},\n\t'.pmtiles': {\n\t\ticon: 'Layers',\n\t\tcolor: 'text-teal-600 dark:text-teal-400',\n\t\tlabel: 'PMTiles',\n\t\tcategory: 'geo',\n\t\tviewer: 'pmtiles',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.fgb': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-teal-500 dark:text-teal-400',\n\t\tlabel: 'FlatGeobuf',\n\t\tcategory: 'geo',\n\t\tviewer: 'flatgeobuf',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.shp': {\n\t\ticon: 'Globe',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'Shapefile',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'ST_Read',\n\t\tmimeType: 'application/x-esri-shape'\n\t},\n\t'.gpkg': {\n\t\ticon: 'Database',\n\t\tcolor: 'text-green-600 dark:text-green-400',\n\t\tlabel: 'GeoPackage',\n\t\tcategory: 'geo',\n\t\tviewer: 'table',\n\t\tqueryable: true,\n\t\tduckdbReadFn: 'ST_Read',\n\t\tmimeType: 'application/geopackage+sqlite3'\n\t},\n\n\t// ── Database ────────────────────────────────────────────────────────\n\t'.duckdb': {\n\t\ticon: 'Database',\n\t\tcolor: 'text-yellow-600 dark:text-yellow-400',\n\t\tlabel: 'DuckDB',\n\t\tcategory: 'database',\n\t\tviewer: 'database',\n\t\tqueryable: true,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.sqlite': {\n\t\ticon: 'Database',\n\t\tcolor: 'text-sky-600 dark:text-sky-400',\n\t\tlabel: 'SQLite',\n\t\tcategory: 'database',\n\t\tviewer: 'database',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-sqlite3'\n\t},\n\t'.db': {\n\t\ticon: 'Database',\n\t\tcolor: 'text-amber-500 dark:text-amber-400',\n\t\tlabel: 'Database',\n\t\tcategory: 'database',\n\t\tviewer: 'database',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\n\t// ── 3D Models ───────────────────────────────────────────────────────\n\t'.glb': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'GLB Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'model/gltf-binary'\n\t},\n\t'.gltf': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'glTF Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'model/gltf+json'\n\t},\n\t'.obj': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'OBJ Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'text/plain'\n\t},\n\t'.stl': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'STL Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'model/stl'\n\t},\n\t'.fbx': {\n\t\ticon: 'Box',\n\t\tcolor: 'text-violet-600 dark:text-violet-400',\n\t\tlabel: 'FBX Model',\n\t\tcategory: '3d',\n\t\tviewer: '3d',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\n\t// ── Notebooks ───────────────────────────────────────────────────────\n\t'.ipynb': {\n\t\ticon: 'BookOpen',\n\t\tcolor: 'text-orange-600 dark:text-orange-400',\n\t\tlabel: 'Jupyter Notebook',\n\t\tcategory: 'code',\n\t\tviewer: 'notebook',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/x-ipynb+json'\n\t},\n\n\t// ── Special ─────────────────────────────────────────────────────────\n\t'.zarr': {\n\t\ticon: 'Layers',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'Zarr',\n\t\tcategory: 'data',\n\t\tviewer: 'zarr',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.zr3': {\n\t\ticon: 'Layers',\n\t\tcolor: 'text-purple-500 dark:text-purple-400',\n\t\tlabel: 'Zarr',\n\t\tcategory: 'data',\n\t\tviewer: 'zarr',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\n\t// ── Point Cloud ─────────────────────────────────────────────────────\n\t'.laz': {\n\t\ticon: 'Orbit',\n\t\tcolor: 'text-cyan-600 dark:text-cyan-400',\n\t\tlabel: 'COPC / LAZ',\n\t\tcategory: 'geo',\n\t\tviewer: 'copc',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t},\n\t'.las': {\n\t\ticon: 'Orbit',\n\t\tcolor: 'text-cyan-600 dark:text-cyan-400',\n\t\tlabel: 'LAS Point Cloud',\n\t\tcategory: 'geo',\n\t\tviewer: 'copc',\n\t\tqueryable: false,\n\t\tduckdbReadFn: null,\n\t\tmimeType: 'application/octet-stream'\n\t}\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Returns full file type information for a given extension.\n * Extension may be with or without leading dot: \".parquet\" or \"parquet\".\n */\nexport function getFileTypeInfo(extension: string, isDir = false): FileTypeInfo {\n\tif (isDir && extension) {\n\t\tconst ext = extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n\t\tconst found = EXTENSIONS[ext];\n\t\tif (found) return found;\n\t}\n\tif (isDir) return FOLDER_INFO;\n\tconst ext = extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n\treturn EXTENSIONS[ext] ?? DEFAULT_INFO;\n}\n\n/** Returns the DuckDB read function name for a file path. Falls back to read_parquet. */\nexport function getDuckDbReadFn(pathOrExt: string): string {\n\tconst ext = pathOrExt.includes('.') ? `.${pathOrExt.split('.').pop()!.toLowerCase()}` : '';\n\treturn EXTENSIONS[ext]?.duckdbReadFn ?? 'read_parquet';\n}\n\n/**\n * Returns a DuckDB FROM-clause expression for a file.\n *\n * For GeoJSON files the raw `read_json_auto` returns a single row with the\n * FeatureCollection structure (`type`, `features`, `bbox`). This helper\n * unnests the features array so each feature becomes its own row with\n * property columns + a geometry column.\n */\nexport function buildDuckDbSource(pathOrExt: string, url: string): string {\n\tconst ext = pathOrExt.includes('.') ? `.${pathOrExt.split('.').pop()!.toLowerCase()}` : '';\n\tif (ext === '.geojson') {\n\t\treturn `(SELECT unnest(feature.properties), to_json(feature.geometry)::VARCHAR AS geometry FROM (SELECT unnest(features) AS feature FROM read_json_auto('${url}', maximum_object_size=1073741824, ignore_errors=true)))`;\n\t}\n\tconst readFn = EXTENSIONS[ext]?.duckdbReadFn ?? 'read_parquet';\n\treturn `${readFn}('${url}')`;\n}\n\n/**\n * Cloud-native formats that DuckDB can query via range requests — metadata\n * reads (schema, row count) are cheap and don't download the full file.\n *\n * Other cloud-native formats (.fgb, .pmtiles, .zarr) also support range\n * requests but have dedicated viewers and don't go through DuckDB/TableViewer.\n */\nconst CLOUD_NATIVE_EXTS = new Set(['.parquet', '.geoparquet', '.gpq', '.gparquet']);\n\nexport function isCloudNativeFormat(pathOrExt: string): boolean {\n\tconst ext = pathOrExt.includes('.') ? `.${pathOrExt.split('.').pop()!.toLowerCase()}` : '';\n\treturn CLOUD_NATIVE_EXTS.has(ext);\n}\n\n/** Returns the viewer kind for a given extension. */\nexport function getViewerKind(extension: string): ViewerKind {\n\treturn getFileTypeInfo(extension).viewer;\n}\n\n/** Returns whether a file can be queried with DuckDB. */\nexport function isQueryable(extension: string): boolean {\n\treturn getFileTypeInfo(extension).queryable;\n}\n\n/** Returns the MIME type for a file extension. */\nexport function getMimeType(extension: string): string {\n\treturn getFileTypeInfo(extension).mimeType;\n}\n\n/** Re-export folder info for components that need it directly. */\nexport { FOLDER_INFO, DEFAULT_INFO };\n","export class QueryCancelledError extends Error {\n\tconstructor() {\n\t\tsuper('Query cancelled');\n\t\tthis.name = 'QueryCancelledError';\n\t}\n}\n\nexport interface QueryHandle {\n\tresult: Promise<QueryResult>;\n\tcancel: () => Promise<boolean>;\n}\n\nexport interface MapQueryHandle {\n\tresult: Promise<MapQueryResult>;\n\tcancel: () => Promise<boolean>;\n}\n\nexport interface QueryResult {\n\tcolumns: string[];\n\ttypes: string[];\n\trowCount: number;\n\t/** Pre-parsed rows — avoids Arrow version mismatch in WASM engine */\n\trows: Record<string, any>[];\n}\n\n/** Raw column data for map rendering (bypasses toJSON serialization). */\nexport interface MapQueryResult {\n\t/** Geometry column as raw WKB binary arrays */\n\twkbArrays: Uint8Array[];\n\t/** Geometry type from ST_GeometryType (e.g., 'POLYGON') */\n\tgeometryType: string;\n\t/** Non-geometry attribute columns: name → JS values */\n\tattributes: Map<string, { values: any[]; type: string }>;\n\t/** Number of rows */\n\trowCount: number;\n}\n\nexport interface SchemaField {\n\tname: string;\n\ttype: string;\n\tnullable: boolean;\n}\n\nexport interface QueryEngine {\n\tquery(connId: string, sql: string): Promise<QueryResult>;\n\tqueryForMap(\n\t\tconnId: string,\n\t\tsql: string,\n\t\tgeomCol: string,\n\t\tgeomColType: string,\n\t\tsourceCrs?: string | null\n\t): Promise<MapQueryResult>;\n\tgetSchema(connId: string, path: string): Promise<SchemaField[]>;\n\tgetRowCount(connId: string, path: string): Promise<number>;\n\t/** Detect CRS from GeoParquet metadata. Returns e.g. 'EPSG:27700' or null if WGS84/unknown. */\n\tdetectCrs(connId: string, path: string, geomCol: string): Promise<string | null>;\n\t/** Combined schema + CRS detection in a single connection (fewer web worker round-trips). */\n\tgetSchemaAndCrs?(\n\t\tconnId: string,\n\t\tpath: string,\n\t\tfindGeoCol: (schema: SchemaField[]) => string | null\n\t): Promise<{ schema: SchemaField[]; geomCol: string | null; crs: string | null }>;\n\tqueryCancellable?(connId: string, sql: string): QueryHandle;\n\tqueryForMapCancellable?(\n\t\tconnId: string,\n\t\tsql: string,\n\t\tgeomCol: string,\n\t\tgeomColType: string,\n\t\tsourceCrs?: string | null\n\t): MapQueryHandle;\n\tforceCancel?(): Promise<void>;\n\treleaseMemory(): Promise<void>;\n\tdispose(): Promise<void>;\n}\n","/**\n * Provider registry — single source of truth for all cloud storage providers.\n *\n * Centralizes endpoint patterns, regions, auth methods, and UI metadata.\n * Used by ConnectionDialog, browser-cloud adapter, host-detection, url-state, etc.\n */\n\n// ---------------------------------------------------------------------------\n// Provider type — the canonical union used by Connection, ConnectionConfig, etc.\n// ---------------------------------------------------------------------------\n\nexport type ProviderId =\n\t| 's3'\n\t| 'gcs'\n\t| 'r2'\n\t| 'minio'\n\t| 'azure'\n\t| 'storj'\n\t| 'b2'\n\t| 'digitalocean'\n\t| 'wasabi'\n\t| 'contabo'\n\t| 'hetzner'\n\t| 'linode'\n\t| 'ovhcloud';\n\n// ---------------------------------------------------------------------------\n// Region definition\n// ---------------------------------------------------------------------------\n\nexport interface ProviderRegion {\n\tcode: string;\n\tlabel: string;\n}\n\n// ---------------------------------------------------------------------------\n// Provider definition\n// ---------------------------------------------------------------------------\n\nexport interface ProviderDef {\n\t/** Display label in the UI. */\n\tlabel: string;\n\t/** Short description shown as helper text. */\n\tdescription: string;\n\t/** Auth method used by this provider. */\n\tauthMethod: 'sigv4' | 'sas-token';\n\t/** Whether the region field is relevant for this provider. */\n\tneedsRegion: boolean;\n\t/** Whether the endpoint field is required. */\n\tneedsEndpoint: boolean;\n\t/** Default region when creating a new connection. */\n\tdefaultRegion: string;\n\t/**\n\t * Endpoint template with `{region}` placeholder.\n\t * If null, the user must provide a custom endpoint (e.g. MinIO).\n\t * If a fixed string (no `{region}`), it's always the same (e.g. GCS).\n\t */\n\tendpointTemplate: string | null;\n\t/** Known regions with labels. Empty = free-form region input. */\n\tregions: ProviderRegion[];\n\t/** Bucket label override (e.g. Azure uses \"Container\"). */\n\tbucketLabel?: string;\n\t/** Default endpoint placeholder shown in the input. */\n\tendpointPlaceholder: string;\n\t/** URI schemes that map to this provider (lowercase, without \"://\"). */\n\tschemes: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nexport const PROVIDERS: Record<ProviderId, ProviderDef> = {\n\ts3: {\n\t\tlabel: 'AWS S3',\n\t\tdescription: 'Amazon S3 or any S3-compatible service',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us-east-1',\n\t\tendpointTemplate: null,\n\t\tregions: [\n\t\t\t{ code: 'us-east-1', label: 'US East (N. Virginia)' },\n\t\t\t{ code: 'us-east-2', label: 'US East (Ohio)' },\n\t\t\t{ code: 'us-west-1', label: 'US West (N. California)' },\n\t\t\t{ code: 'us-west-2', label: 'US West (Oregon)' },\n\t\t\t{ code: 'eu-west-1', label: 'EU (Ireland)' },\n\t\t\t{ code: 'eu-west-2', label: 'EU (London)' },\n\t\t\t{ code: 'eu-west-3', label: 'EU (Paris)' },\n\t\t\t{ code: 'eu-central-1', label: 'EU (Frankfurt)' },\n\t\t\t{ code: 'eu-central-2', label: 'EU (Zurich)' },\n\t\t\t{ code: 'eu-north-1', label: 'EU (Stockholm)' },\n\t\t\t{ code: 'eu-south-1', label: 'EU (Milan)' },\n\t\t\t{ code: 'eu-south-2', label: 'EU (Spain)' },\n\t\t\t{ code: 'ap-northeast-1', label: 'Asia Pacific (Tokyo)' },\n\t\t\t{ code: 'ap-northeast-2', label: 'Asia Pacific (Seoul)' },\n\t\t\t{ code: 'ap-northeast-3', label: 'Asia Pacific (Osaka)' },\n\t\t\t{ code: 'ap-southeast-1', label: 'Asia Pacific (Singapore)' },\n\t\t\t{ code: 'ap-southeast-2', label: 'Asia Pacific (Sydney)' },\n\t\t\t{ code: 'ap-southeast-3', label: 'Asia Pacific (Jakarta)' },\n\t\t\t{ code: 'ap-south-1', label: 'Asia Pacific (Mumbai)' },\n\t\t\t{ code: 'ap-south-2', label: 'Asia Pacific (Hyderabad)' },\n\t\t\t{ code: 'ap-east-1', label: 'Asia Pacific (Hong Kong)' },\n\t\t\t{ code: 'sa-east-1', label: 'South America (São Paulo)' },\n\t\t\t{ code: 'ca-central-1', label: 'Canada (Central)' },\n\t\t\t{ code: 'ca-west-1', label: 'Canada (Calgary)' },\n\t\t\t{ code: 'me-south-1', label: 'Middle East (Bahrain)' },\n\t\t\t{ code: 'me-central-1', label: 'Middle East (UAE)' },\n\t\t\t{ code: 'af-south-1', label: 'Africa (Cape Town)' },\n\t\t\t{ code: 'il-central-1', label: 'Israel (Tel Aviv)' }\n\t\t],\n\t\tendpointPlaceholder: 'Leave empty for AWS, or enter custom S3 endpoint',\n\t\tschemes: ['s3', 's3a', 's3n', 'aws']\n\t},\n\n\tgcs: {\n\t\tlabel: 'Google Cloud',\n\t\tdescription: 'Google Cloud Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'auto',\n\t\tendpointTemplate: 'https://storage.googleapis.com',\n\t\tregions: [],\n\t\tendpointPlaceholder: 'https://storage.googleapis.com',\n\t\tschemes: ['gs', 'gcs']\n\t},\n\n\tr2: {\n\t\tlabel: 'Cloudflare R2',\n\t\tdescription: 'Cloudflare R2 Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: true,\n\t\tdefaultRegion: 'auto',\n\t\tendpointTemplate: null,\n\t\tregions: [],\n\t\tendpointPlaceholder: 'https://<account-id>.r2.cloudflarestorage.com',\n\t\tschemes: ['r2']\n\t},\n\n\tazure: {\n\t\tlabel: 'Azure',\n\t\tdescription: 'Azure Blob Storage',\n\t\tauthMethod: 'sas-token',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: true,\n\t\tdefaultRegion: '',\n\t\tendpointTemplate: null,\n\t\tregions: [],\n\t\tbucketLabel: 'Container',\n\t\tendpointPlaceholder: 'https://<account>.blob.core.windows.net',\n\t\tschemes: ['azure', 'az', 'abfs', 'abfss', 'wasbs', 'adl']\n\t},\n\n\tminio: {\n\t\tlabel: 'MinIO',\n\t\tdescription: 'Self-hosted MinIO or S3-compatible',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: true,\n\t\tdefaultRegion: 'us-east-1',\n\t\tendpointTemplate: null,\n\t\tregions: [],\n\t\tendpointPlaceholder: 'https://minio.example.com or http://localhost:9000',\n\t\tschemes: []\n\t},\n\n\tstorj: {\n\t\tlabel: 'Storj',\n\t\tdescription: 'Storj Decentralized Cloud',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: false,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us1',\n\t\tendpointTemplate: 'https://gateway.storjshare.io',\n\t\tregions: [\n\t\t\t{ code: 'us1', label: 'US1' },\n\t\t\t{ code: 'eu1', label: 'EU1' },\n\t\t\t{ code: 'ap1', label: 'AP1' }\n\t\t],\n\t\tendpointPlaceholder: 'https://gateway.storjshare.io',\n\t\tschemes: ['storj', 'sj']\n\t},\n\n\tb2: {\n\t\tlabel: 'Backblaze B2',\n\t\tdescription: 'Backblaze B2 Cloud Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us-west-004',\n\t\tendpointTemplate: 'https://s3.{region}.backblazeb2.com',\n\t\tregions: [\n\t\t\t{ code: 'us-west-000', label: 'US West (Sacramento)' },\n\t\t\t{ code: 'us-west-001', label: 'US West (Stockton)' },\n\t\t\t{ code: 'us-west-002', label: 'US West (Phoenix)' },\n\t\t\t{ code: 'us-west-004', label: 'US West' },\n\t\t\t{ code: 'us-east-005', label: 'US East (Reston)' },\n\t\t\t{ code: 'eu-central-003', label: 'EU Central (Amsterdam)' },\n\t\t\t{ code: 'ca-central-001', label: 'Canada (Toronto)' }\n\t\t],\n\t\tendpointPlaceholder: 'https://s3.us-west-004.backblazeb2.com',\n\t\tschemes: []\n\t},\n\n\tdigitalocean: {\n\t\tlabel: 'DigitalOcean',\n\t\tdescription: 'DigitalOcean Spaces',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'nyc3',\n\t\tendpointTemplate: 'https://{region}.digitaloceanspaces.com',\n\t\tregions: [\n\t\t\t{ code: 'nyc3', label: 'New York 3' },\n\t\t\t{ code: 'sfo3', label: 'San Francisco 3' },\n\t\t\t{ code: 'ams3', label: 'Amsterdam 3' },\n\t\t\t{ code: 'sgp1', label: 'Singapore 1' },\n\t\t\t{ code: 'lon1', label: 'London 1' },\n\t\t\t{ code: 'fra1', label: 'Frankfurt 1' },\n\t\t\t{ code: 'tor1', label: 'Toronto 1' },\n\t\t\t{ code: 'blr1', label: 'Bangalore 1' },\n\t\t\t{ code: 'syd1', label: 'Sydney 1' }\n\t\t],\n\t\tendpointPlaceholder: 'https://nyc3.digitaloceanspaces.com',\n\t\tschemes: []\n\t},\n\n\twasabi: {\n\t\tlabel: 'Wasabi',\n\t\tdescription: 'Wasabi Hot Cloud Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us-east-1',\n\t\tendpointTemplate: 'https://s3.{region}.wasabisys.com',\n\t\tregions: [\n\t\t\t{ code: 'us-east-1', label: 'US East 1 (Virginia)' },\n\t\t\t{ code: 'us-east-2', label: 'US East 2 (Virginia)' },\n\t\t\t{ code: 'us-central-1', label: 'US Central 1 (Texas)' },\n\t\t\t{ code: 'us-west-1', label: 'US West 1 (Oregon)' },\n\t\t\t{ code: 'eu-central-1', label: 'EU Central 1 (Amsterdam)' },\n\t\t\t{ code: 'eu-central-2', label: 'EU Central 2 (Frankfurt)' },\n\t\t\t{ code: 'eu-west-1', label: 'EU West 1 (London)' },\n\t\t\t{ code: 'eu-west-2', label: 'EU West 2 (Paris)' },\n\t\t\t{ code: 'ap-northeast-1', label: 'AP Northeast 1 (Tokyo)' },\n\t\t\t{ code: 'ap-northeast-2', label: 'AP Northeast 2 (Osaka)' },\n\t\t\t{ code: 'ap-southeast-1', label: 'AP Southeast 1 (Singapore)' },\n\t\t\t{ code: 'ap-southeast-2', label: 'AP Southeast 2 (Sydney)' },\n\t\t\t{ code: 'ca-central-1', label: 'Canada (Toronto)' }\n\t\t],\n\t\tendpointPlaceholder: 'https://s3.us-east-1.wasabisys.com',\n\t\tschemes: []\n\t},\n\n\tcontabo: {\n\t\tlabel: 'Contabo',\n\t\tdescription: 'Contabo Object Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'eu2',\n\t\tendpointTemplate: 'https://{region}.contabostorage.com',\n\t\tregions: [\n\t\t\t{ code: 'eu2', label: 'European Union' },\n\t\t\t{ code: 'usc1', label: 'US Central' },\n\t\t\t{ code: 'sin1', label: 'Singapore' }\n\t\t],\n\t\tendpointPlaceholder: 'https://eu2.contabostorage.com',\n\t\tschemes: []\n\t},\n\n\thetzner: {\n\t\tlabel: 'Hetzner',\n\t\tdescription: 'Hetzner Object Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'fsn1',\n\t\tendpointTemplate: 'https://{region}.your-objectstorage.com',\n\t\tregions: [\n\t\t\t{ code: 'fsn1', label: 'Falkenstein, DE' },\n\t\t\t{ code: 'nbg1', label: 'Nuremberg, DE' },\n\t\t\t{ code: 'hel1', label: 'Helsinki, FI' }\n\t\t],\n\t\tendpointPlaceholder: 'https://fsn1.your-objectstorage.com',\n\t\tschemes: []\n\t},\n\n\tlinode: {\n\t\tlabel: 'Linode / Akamai',\n\t\tdescription: 'Akamai / Linode Object Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'us-east-1',\n\t\tendpointTemplate: 'https://{region}.linodeobjects.com',\n\t\tregions: [\n\t\t\t{ code: 'us-east-1', label: 'Newark, NJ' },\n\t\t\t{ code: 'us-southeast-1', label: 'Atlanta, GA' },\n\t\t\t{ code: 'us-ord-1', label: 'Chicago, IL' },\n\t\t\t{ code: 'us-iad-1', label: 'Washington, DC' },\n\t\t\t{ code: 'us-lax-1', label: 'Los Angeles, CA' },\n\t\t\t{ code: 'us-sea-1', label: 'Seattle, WA' },\n\t\t\t{ code: 'us-mia-1', label: 'Miami, FL' },\n\t\t\t{ code: 'eu-central-1', label: 'Frankfurt, DE' },\n\t\t\t{ code: 'nl-ams-1', label: 'Amsterdam, NL' },\n\t\t\t{ code: 'gb-lon-1', label: 'London, UK' },\n\t\t\t{ code: 'fr-par-1', label: 'Paris, FR' },\n\t\t\t{ code: 'ap-south-1', label: 'Singapore' },\n\t\t\t{ code: 'jp-osa-1', label: 'Osaka, JP' },\n\t\t\t{ code: 'au-mel-1', label: 'Melbourne, AU' },\n\t\t\t{ code: 'br-gru-1', label: 'São Paulo, BR' },\n\t\t\t{ code: 'in-maa-1', label: 'Chennai, IN' },\n\t\t\t{ code: 'id-cgk-1', label: 'Jakarta, ID' },\n\t\t\t{ code: 'it-mil-1', label: 'Milan, IT' },\n\t\t\t{ code: 'se-sto-1', label: 'Stockholm, SE' }\n\t\t],\n\t\tendpointPlaceholder: 'https://us-east-1.linodeobjects.com',\n\t\tschemes: []\n\t},\n\n\tovhcloud: {\n\t\tlabel: 'OVHcloud',\n\t\tdescription: 'OVHcloud Object Storage',\n\t\tauthMethod: 'sigv4',\n\t\tneedsRegion: true,\n\t\tneedsEndpoint: false,\n\t\tdefaultRegion: 'gra',\n\t\tendpointTemplate: 'https://s3.{region}.io.cloud.ovh.net',\n\t\tregions: [\n\t\t\t{ code: 'gra', label: 'Gravelines, FR' },\n\t\t\t{ code: 'sbg', label: 'Strasbourg, FR' },\n\t\t\t{ code: 'bhs', label: 'Beauharnois, CA' },\n\t\t\t{ code: 'de', label: 'Frankfurt, DE' },\n\t\t\t{ code: 'uk', label: 'London, UK' },\n\t\t\t{ code: 'waw', label: 'Warsaw, PL' }\n\t\t],\n\t\tendpointPlaceholder: 'https://s3.gra.io.cloud.ovh.net',\n\t\tschemes: []\n\t}\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** All provider IDs, ordered for the UI. */\nexport const PROVIDER_IDS: ProviderId[] = [\n\t's3',\n\t'gcs',\n\t'r2',\n\t'azure',\n\t'b2',\n\t'digitalocean',\n\t'wasabi',\n\t'storj',\n\t'hetzner',\n\t'contabo',\n\t'linode',\n\t'ovhcloud',\n\t'minio'\n];\n\n/** Get provider def, falling back to S3 for unknown. */\nexport function getProvider(id: string): ProviderDef {\n\treturn PROVIDERS[id as ProviderId] ?? PROVIDERS.s3;\n}\n\n/** Build endpoint URL from template + region. */\nexport function buildEndpointFromTemplate(id: ProviderId, region: string): string {\n\tconst def = PROVIDERS[id];\n\tif (!def?.endpointTemplate) return '';\n\treturn def.endpointTemplate.replace('{region}', region);\n}\n\n/**\n * Build the base URL for API requests (endpoint + bucket).\n * Used by browser-cloud adapter and url-state.\n */\nexport function buildProviderBaseUrl(\n\tprovider: ProviderId,\n\tendpoint: string,\n\tbucket: string,\n\tregion: string\n): string {\n\tif (endpoint) {\n\t\treturn `${endpoint.replace(/\\/$/, '')}/${bucket}`;\n\t}\n\tconst def = PROVIDERS[provider];\n\tif (def?.endpointTemplate) {\n\t\tconst resolved = def.endpointTemplate.replace('{region}', region || def.defaultRegion);\n\t\treturn `${resolved}/${bucket}`;\n\t}\n\t// Fallback: AWS S3 path-style\n\treturn `https://s3.${region || 'us-east-1'}.amazonaws.com/${bucket}`;\n}\n\n/** Check if a provider uses the GCS JSON API (not S3 XML). */\nexport function isGcsProvider(provider: string, endpoint: string): boolean {\n\treturn provider === 'gcs' || (!!endpoint && /storage\\.googleapis\\.com/i.test(endpoint));\n}\n","import type { FileEntry, WriteResult } from '../types.js';\nimport type { StorageAdapter } from './adapter.js';\n\n/**\n * Minimal adapter for direct HTTPS URLs (source: 'url').\n * Only supports read/head — no listing or writing.\n * The `path` parameter is the full HTTPS URL.\n */\nexport class UrlAdapter implements StorageAdapter {\n\treadonly supportsWrite = false;\n\n\tasync read(\n\t\turl: string,\n\t\toffset?: number,\n\t\tlength?: number,\n\t\tsignal?: AbortSignal\n\t): Promise<Uint8Array> {\n\t\tconst headers: Record<string, string> = {};\n\t\tif (offset !== undefined && length !== undefined) {\n\t\t\theaders.Range = `bytes=${offset}-${offset + length - 1}`;\n\t\t} else if (offset !== undefined) {\n\t\t\theaders.Range = `bytes=${offset}-`;\n\t\t}\n\n\t\tconst res = await fetch(url, { headers, signal });\n\t\tif (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\treturn new Uint8Array(await res.arrayBuffer());\n\t}\n\n\tasync head(url: string, signal?: AbortSignal): Promise<FileEntry> {\n\t\tconst res = await fetch(url, { method: 'HEAD', signal });\n\t\tif (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\tconst name = url.split('/').pop()?.split('?')[0] || 'file';\n\t\tconst ext = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n\t\treturn {\n\t\t\tname,\n\t\t\tpath: url,\n\t\t\tis_dir: false,\n\t\t\tsize: Number(res.headers.get('content-length') || 0),\n\t\t\tmodified: new Date(res.headers.get('last-modified') || 0).getTime(),\n\t\t\textension: ext\n\t\t};\n\t}\n\n\tasync list(): Promise<FileEntry[]> {\n\t\treturn [];\n\t}\n\n\tasync put(): Promise<WriteResult> {\n\t\tthrow new Error('Write not supported for direct URL sources');\n\t}\n\n\tasync delete(): Promise<void> {\n\t\tthrow new Error('Delete not supported for direct URL sources');\n\t}\n\n\tasync deletePrefix(): Promise<{ deleted: number }> {\n\t\tthrow new Error('Delete not supported for direct URL sources');\n\t}\n\n\tasync copy(): Promise<WriteResult> {\n\t\tthrow new Error('Copy not supported for direct URL sources');\n\t}\n}\n","/**\n * Cloud storage protocol URL utilities — pure TS, no Svelte dependency.\n *\n * Converts cloud protocol URLs (s3://, gs://) to HTTPS URLs for browser access.\n * Provider-aware native scheme lookup.\n */\n\nimport { buildProviderBaseUrl, PROVIDERS, type ProviderId } from '../storage/providers.js';\n\n/** AWS region pattern — matches prefixes like \"us-west-2\", \"eu-central-1\", etc. */\nconst AWS_REGION_RE =\n\t/^(us|eu|ap|sa|ca|me|af|il)-(north|south|east|west|central|northeast|southeast|northwest|southwest)-\\d+/;\n\n/**\n * Map provider to its native URI scheme prefix.\n * Derived from the registry's `schemes` array (first entry is the primary scheme).\n * Falls back to 's3' for providers without a scheme (S3-compatible).\n */\nexport function getNativeScheme(provider: string): string {\n\tconst def = PROVIDERS[provider as ProviderId];\n\tif (def?.schemes.length) return def.schemes[0];\n\treturn 's3';\n}\n\n/**\n * Safely decode a percent-encoded URI component.\n * Returns the original string if decoding fails (malformed sequences).\n */\nexport function safeDecodeURIComponent(s: string): string {\n\ttry {\n\t\treturn decodeURIComponent(s);\n\t} catch {\n\t\treturn s;\n\t}\n}\n\n/**\n * Convert a cloud storage protocol URL (s3://, gs://) to an HTTPS URL\n * for browser access. Returns the original URL if already HTTP(S) or unknown.\n *\n * Supported:\n * - `s3://bucket/key` → `https://s3.{region}.amazonaws.com/{bucket}/{key}`\n * (region auto-detected from bucket name when possible)\n * - `gs://bucket/key` → `https://storage.googleapis.com/{bucket}/{key}`\n */\nexport function resolveCloudUrl(url: string): string {\n\t// S3 / S3-compatible: s3://, s3a://, s3n://\n\tconst s3Match = url.match(/^s3[an]?:\\/\\/([^/]+)\\/?(.*)$/);\n\tif (s3Match) {\n\t\tconst [, bucket, key] = s3Match;\n\t\t// Detect region from bucket name (e.g. \"us-west-2.opendata.source.coop\")\n\t\tconst regionMatch = bucket.match(AWS_REGION_RE);\n\t\tconst region = regionMatch ? regionMatch[0] : 'us-east-1';\n\t\tconst base = buildProviderBaseUrl('s3', '', bucket, region);\n\t\treturn key ? `${base}/${key}` : base;\n\t}\n\n\t// Google Cloud Storage: gs://, gcs://\n\tconst gcsMatch = url.match(/^gcs?:\\/\\/([^/]+)\\/?(.*)$/);\n\tif (gcsMatch) {\n\t\tconst [, bucket, key] = gcsMatch;\n\t\tconst base = buildProviderBaseUrl('gcs', '', bucket, '');\n\t\treturn key ? `${base}/${key}` : base;\n\t}\n\n\treturn url;\n}\n","export type TypeCategory =\n\t| 'number'\n\t| 'string'\n\t| 'date'\n\t| 'boolean'\n\t| 'geo'\n\t| 'binary'\n\t| 'json'\n\t| 'other';\n\nconst NUMBER_TYPES = [\n\t'TINYINT',\n\t'SMALLINT',\n\t'INTEGER',\n\t'BIGINT',\n\t'HUGEINT',\n\t'UTINYINT',\n\t'USMALLINT',\n\t'UINTEGER',\n\t'UBIGINT',\n\t'FLOAT',\n\t'DOUBLE',\n\t'DECIMAL',\n\t'NUMERIC',\n\t'REAL',\n\t'INT',\n\t'INT1',\n\t'INT2',\n\t'INT4',\n\t'INT8',\n\t'SIGNED',\n\t'SHORT',\n\t'LONG'\n];\n\nconst STRING_TYPES = ['VARCHAR', 'TEXT', 'STRING', 'CHAR', 'BPCHAR', 'NAME', 'UUID', 'ENUM'];\n\nconst DATE_TYPES = [\n\t'DATE',\n\t'TIME',\n\t'TIMESTAMP',\n\t'TIMESTAMP_S',\n\t'TIMESTAMP_MS',\n\t'TIMESTAMP_NS',\n\t'TIMESTAMP WITH TIME ZONE',\n\t'TIMESTAMPTZ',\n\t'INTERVAL',\n\t'TIMESTAMP_TZ'\n];\n\nconst BOOLEAN_TYPES = ['BOOLEAN', 'BOOL', 'LOGICAL'];\n\nconst GEO_TYPES = [\n\t'GEOMETRY',\n\t'POINT',\n\t'LINESTRING',\n\t'POLYGON',\n\t'MULTIPOINT',\n\t'MULTILINESTRING',\n\t'MULTIPOLYGON',\n\t'GEOMETRYCOLLECTION',\n\t'WKB_GEOMETRY'\n];\n\nconst BINARY_TYPES = ['BLOB', 'BYTEA', 'BINARY', 'VARBINARY'];\n\nconst JSON_TYPES = ['JSON', 'JSONB'];\n\nexport function classifyType(duckdbType: string): TypeCategory {\n\tconst upper = duckdbType.toUpperCase().trim();\n\n\t// Handle parameterized types like DECIMAL(18,3), VARCHAR(100)\n\tconst base = upper.replace(/\\(.*\\)/, '').trim();\n\n\tif (NUMBER_TYPES.includes(base)) return 'number';\n\tif (STRING_TYPES.includes(base)) return 'string';\n\tif (DATE_TYPES.includes(base)) return 'date';\n\tif (BOOLEAN_TYPES.includes(base)) return 'boolean';\n\tif (GEO_TYPES.includes(base)) return 'geo';\n\tif (BINARY_TYPES.includes(base)) return 'binary';\n\tif (JSON_TYPES.includes(base)) return 'json';\n\n\t// Compound types\n\tif (base.startsWith('STRUCT') || base.startsWith('MAP') || base.startsWith('UNION'))\n\t\treturn 'json';\n\tif (base.endsWith('[]') || base.startsWith('LIST')) return 'json';\n\n\t// Fallback checks\n\tif (\n\t\tupper.includes('INT') ||\n\t\tupper.includes('FLOAT') ||\n\t\tupper.includes('DOUBLE') ||\n\t\tupper.includes('DECIMAL') ||\n\t\tupper.includes('NUMERIC')\n\t)\n\t\treturn 'number';\n\tif (upper.includes('CHAR') || upper.includes('TEXT') || upper.includes('STRING')) return 'string';\n\tif (upper.includes('TIME') || upper.includes('DATE')) return 'date';\n\tif (upper.includes('BOOL')) return 'boolean';\n\tif (upper.includes('GEOMETRY') || upper.includes('GEO') || upper.includes('WKB')) return 'geo';\n\tif (upper.includes('BLOB') || upper.includes('BINARY')) return 'binary';\n\tif (\n\t\tupper.includes('JSON') ||\n\t\tupper.includes('STRUCT') ||\n\t\tupper.includes('MAP') ||\n\t\tupper.includes('LIST')\n\t)\n\t\treturn 'json';\n\n\treturn 'other';\n}\n\nconst TYPE_COLORS: Record<TypeCategory, string> = {\n\tnumber: 'text-blue-500',\n\tstring: 'text-green-500',\n\tdate: 'text-amber-500',\n\tboolean: 'text-purple-500',\n\tgeo: 'text-teal-500',\n\tbinary: 'text-zinc-500',\n\tjson: 'text-orange-500',\n\tother: 'text-zinc-400'\n};\n\nconst TYPE_BADGE_CLASSES: Record<TypeCategory, string> = {\n\tnumber: 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/20',\n\tstring: 'bg-green-500/10 text-green-600 dark:text-green-400 border-green-500/20',\n\tdate: 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/20',\n\tboolean: 'bg-purple-500/10 text-purple-600 dark:text-purple-400 border-purple-500/20',\n\tgeo: 'bg-teal-500/10 text-teal-600 dark:text-teal-400 border-teal-500/20',\n\tbinary: 'bg-zinc-500/10 text-zinc-600 dark:text-zinc-400 border-zinc-500/20',\n\tjson: 'bg-orange-500/10 text-orange-600 dark:text-orange-400 border-orange-500/20',\n\tother: 'bg-zinc-500/10 text-zinc-500 dark:text-zinc-400 border-zinc-500/20'\n};\n\nconst TYPE_LABELS: Record<TypeCategory, string> = {\n\tnumber: '#',\n\tstring: 'Aa',\n\tdate: 'dt',\n\tboolean: 'T/F',\n\tgeo: 'geo',\n\tbinary: '01',\n\tjson: '{}',\n\tother: '?'\n};\n\nexport function typeColor(category: TypeCategory): string {\n\treturn TYPE_COLORS[category];\n}\n\nexport function typeBadgeClass(category: TypeCategory): string {\n\treturn TYPE_BADGE_CLASSES[category];\n}\n\nexport function typeLabel(category: TypeCategory): string {\n\treturn TYPE_LABELS[category];\n}\n","/**\n * Shared error handling for async viewer load operations.\n */\n\n/**\n * Extract an error message from an unknown caught value.\n * Returns null for AbortError (caller should silently return).\n */\nexport function handleLoadError(err: unknown): string | null {\n\tif (err instanceof DOMException && err.name === 'AbortError') return null;\n\treturn err instanceof Error ? err.message : String(err);\n}\n","/**\n * Formats a byte count into a human-readable string.\n */\nexport function formatFileSize(bytes: number): string {\n\tif (bytes < 0) return '0 B';\n\tif (bytes === 0) return '0 B';\n\n\tconst units = ['B', 'KB', 'MB', 'GB', 'TB'];\n\tconst base = 1024;\n\tconst exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n\tconst value = bytes / base ** exponent;\n\n\t// Use integer display for bytes, one decimal for everything else\n\tif (exponent === 0) return `${bytes} B`;\n\treturn `${value.toFixed(1)} ${units[exponent]}`;\n}\n\n/**\n * Formats a unix timestamp (milliseconds) to a human-readable date string.\n * Shows relative time for recent dates, absolute for older ones.\n */\nexport function formatDate(timestamp: number): string {\n\tif (!timestamp || timestamp <= 0 || !Number.isFinite(timestamp)) return '--';\n\n\tconst date = new Date(timestamp);\n\tconst now = Date.now();\n\tconst diffMs = now - timestamp;\n\tconst diffSeconds = Math.floor(diffMs / 1000);\n\tconst diffMinutes = Math.floor(diffSeconds / 60);\n\tconst diffHours = Math.floor(diffMinutes / 60);\n\tconst diffDays = Math.floor(diffHours / 24);\n\n\tif (diffSeconds < 60) return 'Just now';\n\tif (diffMinutes < 60) return `${diffMinutes}m ago`;\n\tif (diffHours < 24) return `${diffHours}h ago`;\n\tif (diffDays < 7) return `${diffDays}d ago`;\n\n\t// For older dates, show absolute date\n\treturn date.toLocaleDateString(undefined, {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: 'numeric'\n\t});\n}\n\n/**\n * Extracts the file extension from a filename, including the leading dot.\n * Returns an empty string if no extension is found.\n */\nexport function getFileExtension(filename: string): string {\n\tconst lastDot = filename.lastIndexOf('.');\n\tif (lastDot <= 0) return '';\n\treturn filename.slice(lastDot).toLowerCase();\n}\n\n/**\n * JSON replacer that converts BigInt values to strings.\n * Use with `JSON.stringify(value, jsonReplacerBigInt)`.\n */\nexport function jsonReplacerBigInt(_key: string, value: unknown): unknown {\n\treturn typeof value === 'bigint' ? value.toString() : value;\n}\n\n/**\n * Format a value for display in tables, attribute panels, and exports.\n * Handles null, undefined, Date, BigInt, and objects uniformly.\n */\nexport function formatValue(value: unknown): string {\n\tif (value === null || value === undefined) return 'NULL';\n\tif (value instanceof Date) return value.toISOString();\n\tif (typeof value === 'bigint') return value.toString();\n\tif (typeof value === 'object') return JSON.stringify(value, jsonReplacerBigInt);\n\treturn String(value);\n}\n","import { jsonReplacerBigInt } from './format.js';\n\nfunction triggerDownload(content: string, filename: string, mimeType: string) {\n\tconst blob = new Blob([content], { type: mimeType });\n\tconst url = URL.createObjectURL(blob);\n\tconst a = document.createElement('a');\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tdocument.body.removeChild(a);\n\tURL.revokeObjectURL(url);\n}\n\n/** Format a cell value for export (empty string for null/undefined). */\nfunction formatCellValue(value: unknown): string {\n\tif (value === null || value === undefined) return '';\n\tif (value instanceof Date) return value.toISOString();\n\tif (typeof value === 'bigint') return value.toString();\n\tif (typeof value === 'object') return JSON.stringify(value, jsonReplacerBigInt);\n\treturn String(value);\n}\n\n/**\n * Escape a CSV field value per RFC 4180.\n */\nexport function escapeCsvField(value: string): string {\n\tif (value.includes(',') || value.includes('\"') || value.includes('\\n') || value.includes('\\r')) {\n\t\treturn `\"${value.replace(/\"/g, '\"\"')}\"`;\n\t}\n\treturn value;\n}\n\n/**\n * Serialize column/row data to a CSV string.\n * Pure function — no browser APIs, works in Node.js.\n */\nexport function serializeToCsv(columns: string[], rows: Record<string, unknown>[]): string {\n\tconst header = columns.map(escapeCsvField).join(',');\n\tconst body = rows\n\t\t.map((row) => columns.map((col) => escapeCsvField(formatCellValue(row[col]))).join(','))\n\t\t.join('\\n');\n\treturn `${header}\\n${body}`;\n}\n\n/**\n * Serialize column/row data to a formatted JSON string.\n * Pure function — no browser APIs, works in Node.js.\n */\nexport function serializeToJson(columns: string[], rows: Record<string, unknown>[]): string {\n\tconst data = rows.map((row) => {\n\t\tconst obj: Record<string, unknown> = {};\n\t\tfor (const col of columns) {\n\t\t\tconst val = row[col];\n\t\t\tif (val instanceof Date) {\n\t\t\t\tobj[col] = val.toISOString();\n\t\t\t} else {\n\t\t\t\tobj[col] = val ?? null;\n\t\t\t}\n\t\t}\n\t\treturn obj;\n\t});\n\treturn JSON.stringify(data, jsonReplacerBigInt, 2);\n}\n\n/**\n * Export data as CSV file (triggers browser download).\n */\nexport function exportToCsv(columns: string[], rows: Record<string, unknown>[], filename: string) {\n\ttriggerDownload(\n\t\tserializeToCsv(columns, rows),\n\t\tfilename.endsWith('.csv') ? filename : `${filename}.csv`,\n\t\t'text/csv;charset=utf-8;'\n\t);\n}\n\n/**\n * Export data as JSON file (triggers browser download).\n */\nexport function exportToJson(columns: string[], rows: Record<string, unknown>[], filename: string) {\n\ttriggerDownload(\n\t\tserializeToJson(columns, rows),\n\t\tfilename.endsWith('.json') ? filename : `${filename}.json`,\n\t\t'application/json'\n\t);\n}\n","/**\n * Pure file entry sorting — framework-agnostic, works in Node.js.\n */\n\nimport type { FileEntry } from '../types.js';\n\nexport type SortField = 'name' | 'size' | 'modified' | 'extension';\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface SortConfig {\n\tfield: SortField;\n\tdirection: SortDirection;\n}\n\n/**\n * Sort file entries by the given config.\n * Directories always sort before files regardless of sort field.\n * Returns a new array (does not mutate the input).\n */\nexport function sortFileEntries(entries: FileEntry[], config: SortConfig): FileEntry[] {\n\tconst sorted = [...entries];\n\tconst dir = config.direction === 'asc' ? 1 : -1;\n\n\tsorted.sort((a, b) => {\n\t\t// Directories always come first\n\t\tif (a.is_dir && !b.is_dir) return -1;\n\t\tif (!a.is_dir && b.is_dir) return 1;\n\n\t\tswitch (config.field) {\n\t\t\tcase 'name':\n\t\t\t\treturn dir * a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });\n\t\t\tcase 'size':\n\t\t\t\treturn dir * (a.size - b.size);\n\t\t\tcase 'modified':\n\t\t\t\treturn dir * (a.modified - b.modified);\n\t\t\tcase 'extension':\n\t\t\t\treturn dir * a.extension.localeCompare(b.extension, undefined, { sensitivity: 'base' });\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t});\n\n\treturn sorted;\n}\n\n/**\n * Toggle sort config: same field flips direction, new field starts ascending.\n */\nexport function toggleSortField(current: SortConfig, field: SortField): SortConfig {\n\tif (current.field === field) {\n\t\treturn { field, direction: current.direction === 'asc' ? 'desc' : 'asc' };\n\t}\n\treturn { field, direction: 'asc' };\n}\n","/**\n * Direct WKB → GeoArrow bridge (zero-copy).\n *\n * Reads raw WKB binary directly into pre-allocated Arrow typed arrays\n * without any intermediate JS object allocation. No parseWKB(), no GeoJSON.\n *\n * Data flow: WKB Uint8Array[] → DataView binary reads → Float64Array/Int32Array\n * → arrow.makeData() → arrow.Table with ARROW:extension:name metadata\n */\n\nimport type { Data } from 'apache-arrow';\nimport {\n\tField,\n\tFixedSizeList,\n\tFloat64,\n\tList,\n\tmakeData,\n\tRecordBatch,\n\tSchema,\n\tStruct,\n\tTable,\n\tUtf8\n} from 'apache-arrow';\n\nexport type GeoArrowGeomType =\n\t| 'point'\n\t| 'linestring'\n\t| 'polygon'\n\t| 'multipoint'\n\t| 'multilinestring'\n\t| 'multipolygon';\n\nexport interface GeoArrowResult {\n\ttable: Table;\n\tgeometryType: GeoArrowGeomType;\n\tbounds: [number, number, number, number]; // [minX, minY, maxX, maxY]\n\t/** Maps local table row index → original WKB array index (for selection lookup). */\n\tsourceIndices: number[];\n}\n\n/** Map DuckDB ST_GeometryType output to our normalized type. */\nexport function normalizeGeomType(raw: string): GeoArrowGeomType {\n\tconst s = raw.toUpperCase().replace(/\\s+/g, '');\n\tif (s === 'POINT') return 'point';\n\tif (s === 'LINESTRING') return 'linestring';\n\tif (s === 'POLYGON') return 'polygon';\n\tif (s === 'MULTIPOINT') return 'multipoint';\n\tif (s === 'MULTILINESTRING') return 'multilinestring';\n\tif (s === 'MULTIPOLYGON') return 'multipolygon';\n\treturn 'polygon'; // fallback\n}\n\n/** GeoArrow extension name for each geometry type. */\nconst EXTENSION_NAMES: Record<GeoArrowGeomType, string> = {\n\tpoint: 'geoarrow.point',\n\tlinestring: 'geoarrow.linestring',\n\tpolygon: 'geoarrow.polygon',\n\tmultipoint: 'geoarrow.multipoint',\n\tmultilinestring: 'geoarrow.multilinestring',\n\tmultipolygon: 'geoarrow.multipolygon'\n};\n\n// ─── WKB binary header reader ────────────────────────────────────────\n\ninterface WkbHeader {\n\ttype: number; // base geometry type (1–6)\n\tle: boolean; // little-endian\n\tcoordStride: number; // bytes per coordinate point (16=2D, 24=3D/M, 32=ZM)\n\tdataOffset: number; // byte offset where geometry data begins\n}\n\n/** Read WKB/EWKB header — 5 bytes + optional SRID. No allocations. */\nfunction readWkbHeader(wkb: Uint8Array): WkbHeader | null {\n\tif (wkb.length < 5) return null;\n\tconst le = wkb[0] === 1;\n\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\tconst rawType = dv.getUint32(1, le);\n\n\tlet headerSize = 5; // byte_order(1) + type(4)\n\n\t// EWKB SRID flag — 4 extra bytes after type\n\tif ((rawType & 0x20000000) !== 0) headerSize += 4;\n\n\t// EWKB dimension flags\n\tconst ewkbZ = (rawType & 0x80000000) !== 0;\n\tconst ewkbM = (rawType & 0x40000000) !== 0;\n\n\t// Strip all EWKB flags to get base type\n\tlet type = rawType & 0x0fffffff;\n\n\t// ISO Z/M ranges: 1001–1006 (Z), 2001–2006 (M), 3001–3006 (ZM)\n\tlet isoZ = false;\n\tlet isoM = false;\n\tif (type > 3000) {\n\t\tisoZ = true;\n\t\tisoM = true;\n\t\ttype -= 3000;\n\t} else if (type > 2000) {\n\t\tisoM = true;\n\t\ttype -= 2000;\n\t} else if (type > 1000) {\n\t\tisoZ = true;\n\t\ttype -= 1000;\n\t}\n\n\tconst dims = (ewkbZ || isoZ ? 1 : 0) + (ewkbM || isoM ? 1 : 0);\n\tconst coordStride = (2 + dims) * 8; // 16, 24, or 32 bytes\n\n\treturn { type, le, coordStride, dataOffset: headerSize };\n}\n\n/** Classify WKB type from first 5 bytes. No full parse. */\nfunction classifyWkbType(wkb: Uint8Array): GeoArrowGeomType | null {\n\tconst h = readWkbHeader(wkb);\n\tif (!h) return null;\n\tswitch (h.type) {\n\t\tcase 1:\n\t\t\treturn 'point';\n\t\tcase 2:\n\t\t\treturn 'linestring';\n\t\tcase 3:\n\t\t\treturn 'polygon';\n\t\tcase 4:\n\t\t\treturn 'multipoint';\n\t\tcase 5:\n\t\t\treturn 'multilinestring';\n\t\tcase 6:\n\t\t\treturn 'multipolygon';\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n// ─── Bounds tracking ─────────────────────────────────────────────────\n\ninterface BoundsTracker {\n\tminX: number;\n\tminY: number;\n\tmaxX: number;\n\tmaxY: number;\n}\n\nfunction newBounds(): BoundsTracker {\n\treturn { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity };\n}\n\n/** Update bounds, skipping NaN coordinates (EMPTY geometries, invalid data). */\nfunction expandBounds(b: BoundsTracker, x: number, y: number) {\n\tif (Number.isNaN(x) || Number.isNaN(y)) return;\n\tif (x < b.minX) b.minX = x;\n\tif (y < b.minY) b.minY = y;\n\tif (x > b.maxX) b.maxX = x;\n\tif (y > b.maxY) b.maxY = y;\n}\n\n// ─── Arrow coordinate type (shared) ─────────────────────────────────\n\nconst coordField = new Field('xy', new Float64());\nconst coordType = new FixedSizeList(2, coordField);\n\n/** Build FixedSizeList<Float64> Data from a pre-allocated Float64Array. */\nfunction makeCoordData(coords: Float64Array, numPoints: number): Data<FixedSizeList> {\n\tconst floatData = makeData({ type: new Float64(), length: coords.length, data: coords });\n\treturn makeData({ type: coordType, length: numPoints, nullCount: 0, child: floatData });\n}\n\n// ─── Direct WKB → Arrow builders (zero intermediate objects) ─────────\n\n/**\n * POINT: [byte_order:1][type:4][x:8][y:8]\n * Direct read — 2 Float64 reads per geometry. Zero parseWKB.\n */\nfunction buildPointData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst coords = new Float64Array(n * 2);\n\n\tfor (let i = 0; i < n; i++) {\n\t\tconst wkb = wkbs[i];\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 1) {\n\t\t\tcoords[i * 2] = 0;\n\t\t\tcoords[i * 2 + 1] = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst x = dv.getFloat64(h.dataOffset, h.le);\n\t\tconst y = dv.getFloat64(h.dataOffset + 8, h.le);\n\t\tcoords[i * 2] = x;\n\t\tcoords[i * 2 + 1] = y;\n\t\texpandBounds(b, x, y);\n\t}\n\n\treturn makeCoordData(coords, n);\n}\n\n/**\n * LINESTRING: [byte_order:1][type:4][num_points:4][x:8,y:8 × n]\n * Two-pass: count first to pre-allocate, then extract.\n */\nfunction buildLineStringData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst geomOffsets = new Int32Array(n + 1);\n\tlet totalCoords = 0;\n\n\t// Pass 1: count coordinates\n\tfor (let i = 0; i < n; i++) {\n\t\tgeomOffsets[i] = totalCoords;\n\t\tconst h = readWkbHeader(wkbs[i]);\n\t\tif (!h || h.type !== 2) continue;\n\t\tconst dv = new DataView(wkbs[i].buffer, wkbs[i].byteOffset, wkbs[i].byteLength);\n\t\tconst numPts = dv.getUint32(h.dataOffset, h.le);\n\t\ttotalCoords += numPts;\n\t}\n\tgeomOffsets[n] = totalCoords;\n\n\t// Pass 2: extract coordinates directly from binary\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 2) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numPts = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\tconst x = dv.getFloat64(off, h.le);\n\t\t\tconst y = dv.getFloat64(off + 8, h.le);\n\t\t\tcoords[ci++] = x;\n\t\t\tcoords[ci++] = y;\n\t\t\texpandBounds(b, x, y);\n\t\t\toff += h.coordStride;\n\t\t}\n\t}\n\n\tconst fslData = makeCoordData(coords, totalCoords);\n\tconst listType = new List(new Field('vertices', coordType));\n\treturn makeData({\n\t\ttype: listType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: fslData\n\t});\n}\n\n/**\n * POLYGON: [byte_order:1][type:4][num_rings:4]\n * { [num_points:4][x:8,y:8 × n] } × rings\n * Two-pass: count rings+coords first, then extract.\n */\nfunction buildPolygonData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst geomOffsets = new Int32Array(n + 1);\n\tlet totalRings = 0;\n\tlet totalCoords = 0;\n\n\t// Pass 1: count rings and coordinates\n\tfor (let i = 0; i < n; i++) {\n\t\tgeomOffsets[i] = totalRings;\n\t\tconst h = readWkbHeader(wkbs[i]);\n\t\tif (!h || h.type !== 3) continue;\n\t\tconst dv = new DataView(wkbs[i].buffer, wkbs[i].byteOffset, wkbs[i].byteLength);\n\t\tconst numRings = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let r = 0; r < numRings; r++) {\n\t\t\tconst numPts = dv.getUint32(off, h.le);\n\t\t\toff += 4 + numPts * h.coordStride;\n\t\t\ttotalCoords += numPts;\n\t\t\ttotalRings++;\n\t\t}\n\t}\n\tgeomOffsets[n] = totalRings;\n\n\t// Pass 2: extract coordinates and ring offsets\n\tconst ringOffsets = new Int32Array(totalRings + 1);\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet ri = 0;\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 3) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numRings = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let r = 0; r < numRings; r++) {\n\t\t\tringOffsets[ri++] = ci >> 1; // coordIndex = ci / 2\n\t\t\tconst numPts = dv.getUint32(off, h.le);\n\t\t\toff += 4;\n\t\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\t\tconst x = dv.getFloat64(off, h.le);\n\t\t\t\tconst y = dv.getFloat64(off + 8, h.le);\n\t\t\t\tcoords[ci++] = x;\n\t\t\t\tcoords[ci++] = y;\n\t\t\t\texpandBounds(b, x, y);\n\t\t\t\toff += h.coordStride;\n\t\t\t}\n\t\t}\n\t}\n\tringOffsets[totalRings] = ci >> 1;\n\n\tconst coordCount = ci >> 1;\n\tconst fslData = makeCoordData(coords, coordCount);\n\n\tconst ringListType = new List(new Field('vertices', coordType));\n\tconst ringListData = makeData({\n\t\ttype: ringListType,\n\t\tlength: totalRings,\n\t\tnullCount: 0,\n\t\tvalueOffsets: ringOffsets,\n\t\tchild: fslData\n\t});\n\n\tconst polyType = new List(new Field('rings', ringListType));\n\treturn makeData({\n\t\ttype: polyType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: ringListData\n\t});\n}\n\n/** MultiPoint has same Arrow structure as LineString: List<FixedSizeList(2)>. */\nfunction buildMultiPointData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\t// MultiPoint WKB: [header][num_points:4]{Point WKB × n}\n\t// Each inner point has its own WKB header.\n\tconst n = wkbs.length;\n\tconst geomOffsets = new Int32Array(n + 1);\n\tlet totalCoords = 0;\n\n\t// Pass 1: count\n\tfor (let i = 0; i < n; i++) {\n\t\tgeomOffsets[i] = totalCoords;\n\t\tconst h = readWkbHeader(wkbs[i]);\n\t\tif (!h || h.type !== 4) continue;\n\t\tconst dv = new DataView(wkbs[i].buffer, wkbs[i].byteOffset, wkbs[i].byteLength);\n\t\ttotalCoords += dv.getUint32(h.dataOffset, h.le);\n\t}\n\tgeomOffsets[n] = totalCoords;\n\n\t// Pass 2: extract from inner point WKBs\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 4) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numPts = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\t// Each inner point is a full WKB: skip its header to get coords\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (innerH) {\n\t\t\t\tconst x = dv.getFloat64(off + innerH.dataOffset, innerH.le);\n\t\t\t\tconst y = dv.getFloat64(off + innerH.dataOffset + 8, innerH.le);\n\t\t\t\tcoords[ci++] = x;\n\t\t\t\tcoords[ci++] = y;\n\t\t\t\texpandBounds(b, x, y);\n\t\t\t\toff += innerH.dataOffset + innerH.coordStride;\n\t\t\t} else {\n\t\t\t\tcoords[ci++] = 0;\n\t\t\t\tcoords[ci++] = 0;\n\t\t\t\toff += 21; // minimum point WKB size\n\t\t\t}\n\t\t}\n\t}\n\n\tconst fslData = makeCoordData(coords, totalCoords);\n\tconst listType = new List(new Field('vertices', coordType));\n\treturn makeData({\n\t\ttype: listType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: fslData\n\t});\n}\n\n/**\n * MULTILINESTRING: [header][num_lines:4]{LineString WKB × n}\n * Each inner LineString has its own WKB header.\n */\nfunction buildMultiLineStringData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst geomOffsetsArr: number[] = [0];\n\tlet totalLines = 0;\n\tlet totalCoords = 0;\n\n\t// Pass 1: count lines and coordinates\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 5) {\n\t\t\tgeomOffsetsArr.push(totalLines);\n\t\t\tcontinue;\n\t\t}\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numLines = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let l = 0; l < numLines; l++) {\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (!innerH) break;\n\t\t\tconst innerDv = new DataView(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off);\n\t\t\tconst numPts = innerDv.getUint32(innerH.dataOffset, innerH.le);\n\t\t\ttotalCoords += numPts;\n\t\t\toff += innerH.dataOffset + 4 + numPts * innerH.coordStride;\n\t\t\ttotalLines++;\n\t\t}\n\t\tgeomOffsetsArr.push(totalLines);\n\t}\n\n\t// Pass 2: extract\n\tconst geomOffsets = new Int32Array(geomOffsetsArr);\n\tconst lineOffsets = new Int32Array(totalLines + 1);\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet li = 0;\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 5) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numLines = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let l = 0; l < numLines; l++) {\n\t\t\tlineOffsets[li++] = ci >> 1;\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (!innerH) break;\n\t\t\tconst numPts = new DataView(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off).getUint32(\n\t\t\t\tinnerH.dataOffset,\n\t\t\t\tinnerH.le\n\t\t\t);\n\t\t\tlet ptOff = off + innerH.dataOffset + 4;\n\t\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\t\tconst x = dv.getFloat64(ptOff, innerH.le);\n\t\t\t\tconst y = dv.getFloat64(ptOff + 8, innerH.le);\n\t\t\t\tcoords[ci++] = x;\n\t\t\t\tcoords[ci++] = y;\n\t\t\t\texpandBounds(b, x, y);\n\t\t\t\tptOff += innerH.coordStride;\n\t\t\t}\n\t\t\toff = ptOff;\n\t\t}\n\t}\n\tlineOffsets[totalLines] = ci >> 1;\n\n\tconst fslData = makeCoordData(coords, ci >> 1);\n\tconst lineListType = new List(new Field('vertices', coordType));\n\tconst lineListData = makeData({\n\t\ttype: lineListType,\n\t\tlength: totalLines,\n\t\tnullCount: 0,\n\t\tvalueOffsets: lineOffsets,\n\t\tchild: fslData\n\t});\n\n\tconst multiLineType = new List(new Field('lines', lineListType));\n\treturn makeData({\n\t\ttype: multiLineType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: lineListData\n\t});\n}\n\n/**\n * MULTIPOLYGON: [header][num_polys:4]{Polygon WKB × n}\n * Each inner Polygon has its own WKB header.\n */\nfunction buildMultiPolygonData(wkbs: Uint8Array[], b: BoundsTracker): Data {\n\tconst n = wkbs.length;\n\tconst geomOffsetsArr: number[] = [0];\n\tlet totalPolys = 0;\n\tlet totalRings = 0;\n\tlet totalCoords = 0;\n\n\t// Pass 1: count polygons, rings, coordinates\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 6) {\n\t\t\tgeomOffsetsArr.push(totalPolys);\n\t\t\tcontinue;\n\t\t}\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numPolys = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let p = 0; p < numPolys; p++) {\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (!innerH) break;\n\t\t\tconst innerDv = new DataView(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off);\n\t\t\tconst numRings = innerDv.getUint32(innerH.dataOffset, innerH.le);\n\t\t\tlet ringOff = innerH.dataOffset + 4;\n\t\t\tfor (let r = 0; r < numRings; r++) {\n\t\t\t\tconst numPts = innerDv.getUint32(ringOff, innerH.le);\n\t\t\t\tringOff += 4 + numPts * innerH.coordStride;\n\t\t\t\ttotalCoords += numPts;\n\t\t\t\ttotalRings++;\n\t\t\t}\n\t\t\toff += ringOff;\n\t\t\ttotalPolys++;\n\t\t}\n\t\tgeomOffsetsArr.push(totalPolys);\n\t}\n\n\t// Pass 2: extract\n\tconst geomOffsets = new Int32Array(geomOffsetsArr);\n\tconst polyOffsets = new Int32Array(totalPolys + 1);\n\tconst ringOffsets = new Int32Array(totalRings + 1);\n\tconst coords = new Float64Array(totalCoords * 2);\n\tlet pi = 0;\n\tlet ri = 0;\n\tlet ci = 0;\n\n\tfor (const wkb of wkbs) {\n\t\tconst h = readWkbHeader(wkb);\n\t\tif (!h || h.type !== 6) continue;\n\t\tconst dv = new DataView(wkb.buffer, wkb.byteOffset, wkb.byteLength);\n\t\tconst numPolys = dv.getUint32(h.dataOffset, h.le);\n\t\tlet off = h.dataOffset + 4;\n\t\tfor (let p = 0; p < numPolys; p++) {\n\t\t\tpolyOffsets[pi++] = ri;\n\t\t\tconst innerH = readWkbHeader(\n\t\t\t\tnew Uint8Array(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off)\n\t\t\t);\n\t\t\tif (!innerH) break;\n\t\t\tconst innerDv = new DataView(wkb.buffer, wkb.byteOffset + off, wkb.byteLength - off);\n\t\t\tconst numRings = innerDv.getUint32(innerH.dataOffset, innerH.le);\n\t\t\tlet ringOff = off + innerH.dataOffset + 4;\n\t\t\tfor (let r = 0; r < numRings; r++) {\n\t\t\t\tringOffsets[ri++] = ci >> 1;\n\t\t\t\tconst numPts = dv.getUint32(ringOff, innerH.le);\n\t\t\t\tringOff += 4;\n\t\t\t\tfor (let j = 0; j < numPts; j++) {\n\t\t\t\t\tconst x = dv.getFloat64(ringOff, innerH.le);\n\t\t\t\t\tconst y = dv.getFloat64(ringOff + 8, innerH.le);\n\t\t\t\t\tcoords[ci++] = x;\n\t\t\t\t\tcoords[ci++] = y;\n\t\t\t\t\texpandBounds(b, x, y);\n\t\t\t\t\tringOff += innerH.coordStride;\n\t\t\t\t}\n\t\t\t}\n\t\t\toff = ringOff;\n\t\t}\n\t}\n\tpolyOffsets[totalPolys] = ri;\n\tringOffsets[totalRings] = ci >> 1;\n\n\tconst fslData = makeCoordData(coords, ci >> 1);\n\n\tconst ringListType = new List(new Field('vertices', coordType));\n\tconst ringListData = makeData({\n\t\ttype: ringListType,\n\t\tlength: totalRings,\n\t\tnullCount: 0,\n\t\tvalueOffsets: ringOffsets,\n\t\tchild: fslData\n\t});\n\n\tconst polyListType = new List(new Field('rings', ringListType));\n\tconst polyListData = makeData({\n\t\ttype: polyListType,\n\t\tlength: totalPolys,\n\t\tnullCount: 0,\n\t\tvalueOffsets: polyOffsets,\n\t\tchild: ringListData\n\t});\n\n\tconst multiPolyType = new List(new Field('polygons', polyListType));\n\treturn makeData({\n\t\ttype: multiPolyType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tvalueOffsets: geomOffsets,\n\t\tchild: polyListData\n\t});\n}\n\n// ─── Build a single GeoArrow table for one type group ────────────────\n\n/** Build attribute columns for a subset of rows identified by indices. */\nfunction buildAttributeColumns(\n\tindices: number[],\n\tattributes: Map<string, { values: any[]; type: string }>\n): { fields: Field[]; data: Data[] } {\n\tconst n = indices.length;\n\tconst fields: Field[] = [];\n\tconst dataArr: Data[] = [];\n\n\tfor (const [name, col] of attributes) {\n\t\tconst { values } = col;\n\n\t\t// Detect whether values are numeric or string\n\t\tlet isNumeric = true;\n\t\tconst sampleEnd = Math.min(n, 100);\n\t\tfor (let i = 0; i < sampleEnd; i++) {\n\t\t\tif (values[indices[i]] != null && typeof values[indices[i]] !== 'number') {\n\t\t\t\tisNumeric = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (isNumeric) {\n\t\t\tconst arr = new Float64Array(n);\n\t\t\tfor (let i = 0; i < n; i++) arr[i] = values[indices[i]] ?? NaN;\n\t\t\tconst data = makeData({ type: new Float64(), length: n, data: arr });\n\t\t\tfields.push(new Field(name, new Float64(), true));\n\t\t\tdataArr.push(data);\n\t\t} else {\n\t\t\tconst encoder = new TextEncoder();\n\t\t\tconst offsets = new Int32Array(n + 1);\n\t\t\tlet totalBytes = 0;\n\n\t\t\t// Single pass: encode directly into a growing buffer\n\t\t\tconst strParts: Uint8Array[] = [];\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\toffsets[i] = totalBytes;\n\t\t\t\tconst s = values[indices[i]] != null ? String(values[indices[i]]) : '';\n\t\t\t\tconst encoded = encoder.encode(s);\n\t\t\t\tstrParts.push(encoded);\n\t\t\t\ttotalBytes += encoded.length;\n\t\t\t}\n\t\t\toffsets[n] = totalBytes;\n\n\t\t\tconst valueBuffer = new Uint8Array(totalBytes);\n\t\t\tlet pos = 0;\n\t\t\tfor (const sv of strParts) {\n\t\t\t\tvalueBuffer.set(sv, pos);\n\t\t\t\tpos += sv.length;\n\t\t\t}\n\n\t\t\tconst data = makeData({\n\t\t\t\ttype: new Utf8(),\n\t\t\t\tlength: n,\n\t\t\t\tvalueOffsets: offsets,\n\t\t\t\tdata: valueBuffer\n\t\t\t});\n\t\t\tfields.push(new Field(name, new Utf8(), true));\n\t\t\tdataArr.push(data);\n\t\t}\n\t}\n\n\treturn { fields, data: dataArr };\n}\n\n/** Build a single GeoArrow table for one geometry type group. */\nfunction buildSingleTable(\n\tgeomType: GeoArrowGeomType,\n\twkbs: Uint8Array[],\n\tindices: number[],\n\tattributes: Map<string, { values: any[]; type: string }>,\n\tb: BoundsTracker\n): GeoArrowResult {\n\tconst n = wkbs.length;\n\n\tlet geomData: Data;\n\tswitch (geomType) {\n\t\tcase 'point':\n\t\t\tgeomData = buildPointData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'linestring':\n\t\t\tgeomData = buildLineStringData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'polygon':\n\t\t\tgeomData = buildPolygonData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'multipoint':\n\t\t\tgeomData = buildMultiPointData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'multilinestring':\n\t\t\tgeomData = buildMultiLineStringData(wkbs, b);\n\t\t\tbreak;\n\t\tcase 'multipolygon':\n\t\t\tgeomData = buildMultiPolygonData(wkbs, b);\n\t\t\tbreak;\n\t}\n\n\tconst extensionName = EXTENSION_NAMES[geomType];\n\tconst geomMetadata = new Map<string, string>([\n\t\t['ARROW:extension:name', extensionName],\n\t\t[\n\t\t\t'ARROW:extension:metadata',\n\t\t\tJSON.stringify({\n\t\t\t\tcrs: {\n\t\t\t\t\ttype: 'name',\n\t\t\t\t\tproperties: { name: 'urn:ogc:def:crs:OGC:1.3:CRS84' }\n\t\t\t\t}\n\t\t\t})\n\t\t]\n\t]);\n\n\tconst geomField = new Field('geometry', geomData.type, false, geomMetadata);\n\tconst attrCols = buildAttributeColumns(indices, attributes);\n\n\tconst fields: Field[] = [geomField, ...attrCols.fields];\n\tconst childrenData: Data[] = [geomData, ...attrCols.data];\n\n\tconst arrowSchema = new Schema(fields);\n\tconst structType = new Struct(fields);\n\tconst structData = makeData({\n\t\ttype: structType,\n\t\tlength: n,\n\t\tnullCount: 0,\n\t\tchildren: childrenData\n\t});\n\tconst batch = new RecordBatch(arrowSchema, structData);\n\tconst table = new Table(arrowSchema, batch);\n\n\treturn {\n\t\ttable,\n\t\tgeometryType: geomType,\n\t\tbounds: [b.minX, b.minY, b.maxX, b.maxY],\n\t\tsourceIndices: indices\n\t};\n}\n\n// ─── Main entry point ────────────────────────────────────────────────\n\n/**\n * Build GeoArrow tables from raw WKB arrays, automatically splitting by geometry type.\n * Returns one GeoArrowResult per non-empty type group, with shared merged bounds.\n *\n * @param wkbArrays Raw WKB binary arrays from DuckDB\n * @param attributes Attribute columns (non-geometry)\n * @param knownGeomType If provided (e.g. from GeoParquet metadata), skip classification\n */\nexport function buildGeoArrowTables(\n\twkbArrays: Uint8Array[],\n\tattributes: Map<string, { values: any[]; type: string }>,\n\tknownGeomType?: GeoArrowGeomType\n): GeoArrowResult[] {\n\tif (wkbArrays.length === 0) return [];\n\n\t// Fast path: known geometry type from metadata — skip classification entirely\n\tif (knownGeomType) {\n\t\tconst globalBounds = newBounds();\n\t\tconst indices = Array.from({ length: wkbArrays.length }, (_, i) => i);\n\t\tconst result = buildSingleTable(knownGeomType, wkbArrays, indices, attributes, globalBounds);\n\t\treturn [result];\n\t}\n\n\t// Classify by reading only the type bytes (5 bytes per WKB, not full parse)\n\tconst groups = new Map<GeoArrowGeomType, { wkbs: Uint8Array[]; indices: number[] }>();\n\n\tfor (let i = 0; i < wkbArrays.length; i++) {\n\t\tconst geomType = classifyWkbType(wkbArrays[i]);\n\t\tif (!geomType) continue;\n\n\t\tlet group = groups.get(geomType);\n\t\tif (!group) {\n\t\t\tgroup = { wkbs: [], indices: [] };\n\t\t\tgroups.set(geomType, group);\n\t\t}\n\t\tgroup.wkbs.push(wkbArrays[i]);\n\t\tgroup.indices.push(i);\n\t}\n\n\tif (groups.size === 0) return [];\n\n\tconst globalBounds = newBounds();\n\tconst results: GeoArrowResult[] = [];\n\n\tfor (const [geomType, { wkbs, indices }] of groups) {\n\t\tconst result = buildSingleTable(geomType, wkbs, indices, attributes, globalBounds);\n\t\tresults.push(result);\n\t}\n\n\t// Share merged bounds across all results\n\tconst mergedBounds: [number, number, number, number] = [\n\t\tglobalBounds.minX,\n\t\tglobalBounds.minY,\n\t\tglobalBounds.maxX,\n\t\tglobalBounds.maxY\n\t];\n\tfor (const r of results) r.bounds = mergedBounds;\n\n\treturn results;\n}\n","export interface HexRow {\n\toffset: string;\n\thex: string[];\n\tascii: string;\n}\n\n/**\n * Generates a hex dump from binary data.\n * Returns rows of offset | hex bytes | ASCII representation.\n */\nexport function generateHexDump(data: Uint8Array, bytesPerRow = 16): HexRow[] {\n\tconst rows: HexRow[] = [];\n\n\tfor (let i = 0; i < data.length; i += bytesPerRow) {\n\t\tconst slice = data.slice(i, i + bytesPerRow);\n\t\tconst offset = i.toString(16).padStart(8, '0');\n\n\t\tconst hex: string[] = [];\n\t\tfor (let j = 0; j < bytesPerRow; j++) {\n\t\t\tif (j < slice.length) {\n\t\t\t\thex.push(slice[j].toString(16).padStart(2, '0'));\n\t\t\t} else {\n\t\t\t\thex.push(' ');\n\t\t\t}\n\t\t}\n\n\t\tlet ascii = '';\n\t\tfor (let j = 0; j < slice.length; j++) {\n\t\t\tconst byte = slice[j];\n\t\t\tascii += byte >= 0x20 && byte <= 0x7e ? String.fromCharCode(byte) : '.';\n\t\t}\n\n\t\trows.push({ offset, hex, ascii });\n\t}\n\n\treturn rows;\n}\n","/**\n * Generic localStorage helpers with SSR safety.\n *\n * Used by connection, settings, and query-history stores to avoid\n * repeating the same load/persist/try-catch/SSR-guard pattern.\n */\n\n/**\n * Load a JSON value from localStorage.\n * Returns `defaultValue` on SSR, missing key, or parse error.\n */\nexport function loadFromStorage<T>(key: string, defaultValue: T): T {\n\tif (typeof window === 'undefined') return defaultValue;\n\ttry {\n\t\tconst raw = localStorage.getItem(key);\n\t\tif (raw) return JSON.parse(raw) as T;\n\t} catch {\n\t\t// ignore parse errors\n\t}\n\treturn defaultValue;\n}\n\n/**\n * Persist a JSON-serializable value to localStorage.\n * Silently no-ops on SSR or storage errors (quota, private browsing).\n */\nexport function persistToStorage(key: string, value: unknown): void {\n\tif (typeof window === 'undefined') return;\n\ttry {\n\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t} catch {\n\t\t// ignore storage errors\n\t}\n}\n","import YAML from 'yaml';\n\nexport interface SqlBlock {\n\tname: string;\n\tsql: string;\n\tstartLine: number;\n\tendLine: number;\n}\n\nexport interface ParsedMarkdownDocument {\n\tfrontmatter: Record<string, any>;\n\tcontent: string;\n\tsqlBlocks: SqlBlock[];\n}\n\n/**\n * Parse a markdown document with YAML frontmatter and SQL code blocks.\n *\n * Evidence-compatible syntax:\n * ```sql query_name\n * SELECT * FROM table\n * ```\n */\nexport function parseMarkdownDocument(markdown: string): ParsedMarkdownDocument {\n\tlet frontmatter: Record<string, any> = {};\n\tlet content = markdown;\n\n\t// Extract YAML frontmatter\n\tconst fmMatch = markdown.match(/^---\\n([\\s\\S]*?)\\n---\\n/);\n\tif (fmMatch) {\n\t\ttry {\n\t\t\tfrontmatter = YAML.parse(fmMatch[1]) || {};\n\t\t} catch {\n\t\t\t// Invalid YAML — ignore\n\t\t}\n\t\tcontent = markdown.slice(fmMatch[0].length);\n\t}\n\n\t// Extract SQL blocks\n\tconst sqlBlocks: SqlBlock[] = [];\n\tconst lines = content.split('\\n');\n\tlet i = 0;\n\n\twhile (i < lines.length) {\n\t\tconst line = lines[i];\n\t\tconst match = line.match(/^```sql\\s+(\\w[\\w-]*)\\s*$/);\n\n\t\tif (match) {\n\t\t\tconst name = match[1];\n\t\t\tconst startLine = i;\n\t\t\tconst sqlLines: string[] = [];\n\t\t\ti++;\n\n\t\t\twhile (i < lines.length && lines[i] !== '```') {\n\t\t\t\tsqlLines.push(lines[i]);\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tsqlBlocks.push({\n\t\t\t\tname,\n\t\t\t\tsql: sqlLines.join('\\n'),\n\t\t\t\tstartLine,\n\t\t\t\tendLine: i\n\t\t\t});\n\t\t}\n\t\ti++;\n\t}\n\n\treturn { frontmatter, content, sqlBlocks };\n}\n\n/**\n * Interpolate template variables in markdown text.\n * Supports {queryName.rows[0].columnName} syntax.\n */\nexport function interpolateTemplates(\n\ttext: string,\n\tqueryResults: Map<string, Record<string, any>[]>\n): string {\n\treturn text.replace(/\\{(\\w+)\\.rows\\[(\\d+)\\]\\.(\\w+)\\}/g, (match, queryName, rowIdx, colName) => {\n\t\tconst rows = queryResults.get(queryName);\n\t\tif (!rows) return match;\n\t\tconst row = rows[parseInt(rowIdx, 10)];\n\t\tif (!row) return match;\n\t\tconst value = row[colName];\n\t\treturn value !== undefined ? String(value) : match;\n\t});\n}\n\n/**\n * Replace SQL blocks in markdown content with placeholder markers\n * that can be replaced with rendered components.\n */\nexport function markSqlBlocks(content: string): string {\n\treturn content.replace(\n\t\t/```sql\\s+(\\w[\\w-]*)\\s*\\n([\\s\\S]*?)```/g,\n\t\t(_, name) => `<div data-sql-block=\"${name}\"></div>`\n\t);\n}\n","/**\n * Lightweight Parquet metadata reader using hyparquet.\n *\n * Reads schema, row count, CRS, and geometry types from the Parquet footer\n * via a single HTTP range request (~512KB). No DuckDB boot needed.\n *\n * This provides instant metadata display before DuckDB-WASM finishes loading.\n */\n\nimport { WGS84_CODES } from '../constants.js';\nimport type { GeoArrowGeomType } from './geoarrow.js';\n\nexport interface GeoColumnMeta {\n\tencoding: string;\n\tgeometryTypes: string[];\n\tcrs: any | null;\n\tbbox?: number[];\n}\n\nexport interface GeoParquetMeta {\n\tprimaryColumn: string;\n\tcolumns: Record<string, GeoColumnMeta>;\n}\n\nexport interface ParquetFileMetadata {\n\t/** Total number of rows across all row groups. */\n\trowCount: number;\n\t/** Column schema (name + type). */\n\tschema: { name: string; type: string }[];\n\t/** GeoParquet \"geo\" metadata if present. */\n\tgeo: GeoParquetMeta | null;\n\t/** True when file has legacy GeoParquet metadata (schema_version 0.x without \"version\" field). */\n\tlegacyGeoParquet: boolean;\n\t/** Tool that created the file (e.g. \"pyarrow 15.0.0\"). */\n\tcreatedBy: string | null;\n\t/** Number of row groups. */\n\tnumRowGroups: number;\n\t/** Primary compression codec (e.g. \"SNAPPY\", \"ZSTD\"). */\n\tcompression: string | null;\n}\n\n/** Map hyparquet schema element types to DuckDB-like type strings. */\nfunction mapParquetType(col: any): string {\n\tconst lt = col.logical_type;\n\tif (lt) {\n\t\t// Parquet Format 2.11+ native geometry/geography types\n\t\tif (lt.type === 'GEOMETRY' || lt.type === 'GEOGRAPHY') return 'GEOMETRY';\n\t\t// String types\n\t\tif (lt.type === 'STRING' || lt.type === 'UTF8') return 'VARCHAR';\n\t\tif (lt.type === 'JSON') return 'JSON';\n\t\tif (lt.type === 'UUID') return 'UUID';\n\t\tif (lt.type === 'ENUM') return 'VARCHAR';\n\t\t// Integer types\n\t\tif (lt.type === 'INT' || lt.type === 'INTEGER') {\n\t\t\tconst bits = lt.bitWidth ?? 32;\n\t\t\tconst signed = lt.isSigned !== false;\n\t\t\tif (bits <= 8) return signed ? 'TINYINT' : 'UTINYINT';\n\t\t\tif (bits <= 16) return signed ? 'SMALLINT' : 'USMALLINT';\n\t\t\tif (bits <= 32) return signed ? 'INTEGER' : 'UINTEGER';\n\t\t\treturn signed ? 'BIGINT' : 'UBIGINT';\n\t\t}\n\t\t// Decimal\n\t\tif (lt.type === 'DECIMAL') return `DECIMAL(${lt.precision ?? 18},${lt.scale ?? 0})`;\n\t\t// Date/Time\n\t\tif (lt.type === 'DATE') return 'DATE';\n\t\tif (lt.type === 'TIME') return 'TIME';\n\t\tif (lt.type === 'TIMESTAMP') return 'TIMESTAMP';\n\t\t// Binary\n\t\tif (lt.type === 'BSON') return 'BLOB';\n\t}\n\n\t// Fallback to physical type\n\tconst ct = col.converted_type;\n\tif (ct === 'UTF8') return 'VARCHAR';\n\tif (ct === 'JSON') return 'JSON';\n\tif (ct === 'DATE') return 'DATE';\n\tif (ct === 'TIMESTAMP_MILLIS' || ct === 'TIMESTAMP_MICROS') return 'TIMESTAMP';\n\tif (ct === 'DECIMAL') return `DECIMAL(${col.precision ?? 18},${col.scale ?? 0})`;\n\tif (ct === 'INT_8') return 'TINYINT';\n\tif (ct === 'INT_16') return 'SMALLINT';\n\tif (ct === 'INT_32') return 'INTEGER';\n\tif (ct === 'INT_64') return 'BIGINT';\n\tif (ct === 'UINT_8') return 'UTINYINT';\n\tif (ct === 'UINT_16') return 'USMALLINT';\n\tif (ct === 'UINT_32') return 'UINTEGER';\n\tif (ct === 'UINT_64') return 'UBIGINT';\n\n\tconst pt = col.type;\n\tif (pt === 'BOOLEAN') return 'BOOLEAN';\n\tif (pt === 'INT32') return 'INTEGER';\n\tif (pt === 'INT64') return 'BIGINT';\n\tif (pt === 'INT96') return 'TIMESTAMP';\n\tif (pt === 'FLOAT') return 'FLOAT';\n\tif (pt === 'DOUBLE') return 'DOUBLE';\n\tif (pt === 'BYTE_ARRAY') return 'BLOB';\n\tif (pt === 'FIXED_LEN_BYTE_ARRAY') return 'BLOB';\n\n\treturn 'VARCHAR';\n}\n\n/**\n * Read Parquet footer metadata from a remote URL using hyparquet.\n * Uses HTTP range requests — typically a single ~512KB fetch.\n */\nexport async function readParquetMetadata(url: string): Promise<ParquetFileMetadata> {\n\tconst { parquetMetadataAsync, asyncBufferFromUrl } = await import('hyparquet');\n\n\tconst file = await asyncBufferFromUrl({ url });\n\tconst metadata = await parquetMetadataAsync(file);\n\n\t// Row count from row group metadata (no data scan needed)\n\tconst rowCount = metadata.row_groups.reduce(\n\t\t(sum: number, rg: any) => sum + Number(rg.num_rows),\n\t\t0\n\t);\n\n\t// Schema from metadata (skip root element at index 0)\n\tconst schema = metadata.schema\n\t\t.slice(1)\n\t\t.filter((col: any) => col.num_children === undefined) // skip group elements\n\t\t.map((col: any) => ({\n\t\t\tname: col.name,\n\t\t\ttype: mapParquetType(col)\n\t\t}));\n\n\t// GeoParquet \"geo\" key-value metadata\n\tlet geo: GeoParquetMeta | null = null;\n\tlet legacyGeoParquet = false;\n\tconst geoKv = metadata.key_value_metadata?.find((kv: any) => kv.key === 'geo');\n\tif (geoKv) {\n\t\ttry {\n\t\t\tconst geoJson = JSON.parse(geoKv.value ?? '');\n\n\t\t\t// Detect legacy GeoParquet (schema_version 0.x without \"version\" field).\n\t\t\t// Early geopandas (<0.12) wrote schema_version instead of version.\n\t\t\t// DuckDB's spatial extension rejects these files with:\n\t\t\t// \"Geoparquet metadata does not have a version\"\n\t\t\tif (geoJson.schema_version && !geoJson.version) {\n\t\t\t\tlegacyGeoParquet = true;\n\t\t\t}\n\n\t\t\tgeo = {\n\t\t\t\tprimaryColumn: geoJson.primary_column ?? 'geometry',\n\t\t\t\tcolumns: {}\n\t\t\t};\n\t\t\tif (geoJson.columns) {\n\t\t\t\tfor (const [colName, colMeta] of Object.entries(geoJson.columns) as [string, any][]) {\n\t\t\t\t\tgeo.columns[colName] = {\n\t\t\t\t\t\tencoding: colMeta.encoding ?? 'WKB',\n\t\t\t\t\t\tgeometryTypes: colMeta.geometry_types ?? [],\n\t\t\t\t\t\tcrs: colMeta.crs ?? null,\n\t\t\t\t\t\tbbox: colMeta.bbox\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// malformed geo metadata — ignore\n\t\t}\n\t}\n\n\t// Created-by tool\n\tconst createdBy = metadata.created_by ?? null;\n\n\t// Row group count\n\tconst numRowGroups = metadata.row_groups.length;\n\n\t// Compression: collect unique codecs from first row group's columns\n\tlet compression: string | null = null;\n\tif (numRowGroups > 0 && metadata.row_groups[0].columns) {\n\t\tconst codecs = new Set<string>();\n\t\tfor (const col of metadata.row_groups[0].columns) {\n\t\t\tconst codec = col.meta_data?.codec;\n\t\t\tif (codec) codecs.add(codec);\n\t\t}\n\t\tif (codecs.size === 1) {\n\t\t\tcompression = [...codecs][0];\n\t\t} else if (codecs.size > 1) {\n\t\t\tcompression = [...codecs].join(', ');\n\t\t}\n\t}\n\n\treturn { rowCount, schema, geo, legacyGeoParquet, createdBy, numRowGroups, compression };\n}\n\n/**\n * Extract EPSG code from GeoParquet CRS metadata.\n * Returns null for WGS84/CRS84 (no reprojection needed).\n */\nexport function extractEpsgFromGeoMeta(geo: GeoParquetMeta): string | null {\n\tconst primaryCol = geo.columns[geo.primaryColumn];\n\tif (!primaryCol?.crs) return null;\n\n\tconst crs = primaryCol.crs;\n\n\t// OGC CRS84 is lon/lat WGS84\n\tif (crs.type === 'name' && crs.properties?.name?.includes('CRS84')) return null;\n\n\t// PROJJSON: { \"id\": { \"authority\": \"EPSG\", \"code\": 27700 } }\n\tif (crs.id?.authority === 'EPSG') {\n\t\tconst code = crs.id.code;\n\t\tif (WGS84_CODES.has(code)) return null;\n\t\treturn `EPSG:${code}`;\n\t}\n\n\treturn null;\n}\n\n/**\n * Extract normalized geometry types from GeoParquet metadata.\n * Returns the set of geometry types for the primary column.\n */\nexport function extractGeometryTypes(geo: GeoParquetMeta): GeoArrowGeomType[] {\n\tconst primaryCol = geo.columns[geo.primaryColumn];\n\tif (!primaryCol?.geometryTypes?.length) return [];\n\n\tconst typeMap: Record<string, GeoArrowGeomType> = {\n\t\tPoint: 'point',\n\t\tLineString: 'linestring',\n\t\tPolygon: 'polygon',\n\t\tMultiPoint: 'multipoint',\n\t\tMultiLineString: 'multilinestring',\n\t\tMultiPolygon: 'multipolygon'\n\t};\n\n\tconst types: GeoArrowGeomType[] = [];\n\tfor (const raw of primaryCol.geometryTypes) {\n\t\t// GeoParquet geometry_types may include Z/M suffixes like \"Polygon Z\"\n\t\tconst base = raw.split(' ')[0];\n\t\tconst mapped = typeMap[base];\n\t\tif (mapped && !types.includes(mapped)) types.push(mapped);\n\t}\n\treturn types;\n}\n\n/**\n * Extract bounds from GeoParquet metadata (bbox field).\n * Returns [minX, minY, maxX, maxY] or null.\n */\nexport function extractBounds(geo: GeoParquetMeta): [number, number, number, number] | null {\n\tconst primaryCol = geo.columns[geo.primaryColumn];\n\tif (!primaryCol?.bbox || primaryCol.bbox.length < 4) return null;\n\treturn [primaryCol.bbox[0], primaryCol.bbox[1], primaryCol.bbox[2], primaryCol.bbox[3]];\n}\n","/**\n * Universal cloud storage URL / bucket parser.\n *\n * Accepts the many URI/URL formats that users commonly paste and extracts\n * the correct bucket, region, endpoint, and provider.\n *\n * Supported URI schemes:\n * s3:// s3a:// s3n:// aws:// — Amazon S3 / S3-compatible\n * r2:// — Cloudflare R2\n * gs:// gcs:// — Google Cloud Storage\n * azure:// az:// — Azure Blob Storage\n * abfs:// abfss:// — Azure Data Lake (ADLS Gen2)\n * wasbs:// — Azure Blob (Hadoop WASB driver)\n * swift:// — OpenStack Swift\n * file:// filesystem:// — Local filesystem\n *\n * Supported HTTPS URL patterns:\n * https://<bucket>.s3.<region>.amazonaws.com[/prefix] — AWS virtual-hosted\n * https://s3.<region>.amazonaws.com/<bucket>[/prefix] — AWS path-style\n * https://s3.amazonaws.com/<bucket> — AWS global\n * https://<account>.r2.cloudflarestorage.com/<bucket> — Cloudflare R2\n * https://storage.googleapis.com/<bucket> — Google Cloud Storage\n * https://<bucket>.storage.googleapis.com[/prefix] — GCS virtual-hosted\n * https://<bucket>.<region>.digitaloceanspaces.com — DigitalOcean Spaces\n * https://<region>.digitaloceanspaces.com/<bucket> — DO Spaces path-style\n * https://s3.<region>.wasabisys.com/<bucket> — Wasabi\n * https://f<id>.backblazeb2.com/file/<bucket> — Backblaze B2\n * https://<bucket>.s3.<region>.backblazeb2.com — B2 S3-compatible\n * https://<bucket>.oss-<region>.aliyuncs.com — Alibaba Cloud OSS\n * https://<bucket>.cos.<region>.myqcloud.com — Tencent COS\n * https://storage.yandexcloud.net/<bucket> — Yandex Cloud\n * https://gateway.storjshare.io/<bucket> — Storj S3 gateway\n * https://link.storjshare.io/raw/<access>/<bucket> — Storj linksharing\n * https://<custom-endpoint>/<bucket> — Generic S3-compatible\n *\n * Also handles plain bucket names (no protocol).\n */\n\nimport { PROVIDERS } from '../storage/providers.js';\n\nexport type StorageProvider = string;\n\nexport interface ParsedStorageUrl {\n\tbucket: string;\n\tregion: string;\n\tendpoint: string;\n\tprovider: StorageProvider;\n\t/** Original prefix/path after bucket, if any */\n\tprefix: string;\n}\n\n/**\n * Build SCHEME_MAP from the provider registry's `schemes` arrays.\n * Each scheme like \"s3\" generates an entry `\"s3://\": { provider: \"s3\", strip: 5 }`.\n */\nfunction buildSchemeMap(): Record<string, { provider: StorageProvider; strip: number }> {\n\tconst map: Record<string, { provider: StorageProvider; strip: number }> = {};\n\tfor (const [id, def] of Object.entries(PROVIDERS)) {\n\t\tfor (const scheme of def.schemes) {\n\t\t\tconst key = `${scheme}://`;\n\t\t\tmap[key] = { provider: id, strip: key.length };\n\t\t}\n\t}\n\t// Non-registry schemes (no corresponding provider)\n\tmap['swift://'] = { provider: 'unknown', strip: 8 };\n\treturn map;\n}\n\n/** All recognized URI scheme prefixes (lowercase), derived from provider registry */\nconst SCHEME_MAP = buildSchemeMap();\n\nexport interface Defaults {\n\tregion?: string;\n\tendpoint?: string;\n\tprovider?: StorageProvider;\n}\n\nfunction defaultResult(defaults: Defaults): ParsedStorageUrl {\n\treturn {\n\t\tbucket: '',\n\t\tregion: defaults.region || 'us-east-1',\n\t\tendpoint: defaults.endpoint || '',\n\t\tprovider: defaults.provider || 's3',\n\t\tprefix: ''\n\t};\n}\n\nfunction splitBucketPrefix(rest: string): { bucket: string; prefix: string } {\n\tconst slashIdx = rest.indexOf('/');\n\tif (slashIdx >= 0) {\n\t\treturn {\n\t\t\tbucket: rest.slice(0, slashIdx),\n\t\t\tprefix: rest.slice(slashIdx + 1).replace(/\\/+$/, '')\n\t\t};\n\t}\n\treturn { bucket: rest, prefix: '' };\n}\n\n/**\n * Parse a user-provided bucket/URL string into structured storage connection parts.\n */\nexport function parseStorageUrl(input: string, defaults: Defaults = {}): ParsedStorageUrl {\n\tconst trimmed = input.trim();\n\n\t// ── Custom URI schemes (s3://, gs://, r2://, az://, etc.) ──────────\n\tconst lower = trimmed.toLowerCase();\n\tfor (const [scheme, { provider, strip }] of Object.entries(SCHEME_MAP)) {\n\t\tif (lower.startsWith(scheme)) {\n\t\t\tconst rest = trimmed.slice(strip);\n\t\t\tconst { bucket, prefix } = splitBucketPrefix(rest);\n\t\t\treturn {\n\t\t\t\tbucket,\n\t\t\t\tregion: defaults.region || 'us-east-1',\n\t\t\t\tendpoint: defaults.endpoint || '',\n\t\t\t\tprovider,\n\t\t\t\tprefix\n\t\t\t};\n\t\t}\n\t}\n\n\t// ── HTTP(S) URL ─────────────────────────────────────────────────\n\tif (lower.startsWith('http://') || lower.startsWith('https://')) {\n\t\ttry {\n\t\t\tconst url = new URL(trimmed);\n\t\t\tconst host = url.hostname;\n\t\t\tconst pathParts = url.pathname.replace(/^\\//, '').split('/').filter(Boolean);\n\n\t\t\t// --- AWS S3 ---\n\n\t\t\t// Virtual-hosted: <bucket>.s3.<region>.amazonaws.com\n\t\t\tconst awsVhost = host.match(/^(.+)\\.s3[.-]([a-z0-9-]+)\\.amazonaws\\.com$/);\n\t\t\tif (awsVhost) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: awsVhost[1],\n\t\t\t\t\tregion: awsVhost[2],\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Path-style: s3.<region>.amazonaws.com/<bucket>\n\t\t\tconst awsPath = host.match(/^s3[.-]([a-z0-9-]+)\\.amazonaws\\.com$/);\n\t\t\tif (awsPath && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: awsPath[1],\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Global: s3.amazonaws.com/<bucket>\n\t\t\tif (host === 's3.amazonaws.com' && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'us-east-1',\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Cloudflare R2 ---\n\t\t\t// <account>.r2.cloudflarestorage.com/<bucket>\n\t\t\tconst r2Match = host.match(/^([a-z0-9]+)\\.r2\\.cloudflarestorage\\.com$/);\n\t\t\tif (r2Match && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: 'auto',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'r2',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Google Cloud Storage ---\n\t\t\t// storage.googleapis.com/<bucket>\n\t\t\tif (host === 'storage.googleapis.com' && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'us',\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 'gcs',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// <bucket>.storage.googleapis.com\n\t\t\tconst gcsVhost = host.match(/^(.+)\\.storage\\.googleapis\\.com$/);\n\t\t\tif (gcsVhost) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: gcsVhost[1],\n\t\t\t\t\tregion: defaults.region || 'us',\n\t\t\t\t\tendpoint: '',\n\t\t\t\t\tprovider: 'gcs',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- DigitalOcean Spaces ---\n\t\t\t// <bucket>.<region>.digitaloceanspaces.com\n\t\t\tconst doVhost = host.match(/^(.+)\\.([a-z0-9-]+)\\.digitaloceanspaces\\.com$/);\n\t\t\tif (doVhost) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: doVhost[1],\n\t\t\t\t\tregion: doVhost[2],\n\t\t\t\t\tendpoint: `${url.protocol}//${doVhost[2]}.digitaloceanspaces.com`,\n\t\t\t\t\tprovider: 'digitalocean',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// <region>.digitaloceanspaces.com/<bucket>\n\t\t\tconst doPath = host.match(/^([a-z0-9-]+)\\.digitaloceanspaces\\.com$/);\n\t\t\tif (doPath && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: doPath[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'digitalocean',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Wasabi ---\n\t\t\t// s3.<region>.wasabisys.com/<bucket>\n\t\t\tconst wasabiMatch = host.match(/^s3\\.([a-z0-9-]+)\\.wasabisys\\.com$/);\n\t\t\tif (wasabiMatch && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: wasabiMatch[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'wasabi',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Backblaze B2 ---\n\t\t\t// <bucket>.s3.<region>.backblazeb2.com (S3-compatible)\n\t\t\tconst b2S3 = host.match(/^(.+)\\.s3\\.([a-z0-9-]+)\\.backblazeb2\\.com$/);\n\t\t\tif (b2S3) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: b2S3[1],\n\t\t\t\t\tregion: b2S3[2],\n\t\t\t\t\tendpoint: `${url.protocol}//s3.${b2S3[2]}.backblazeb2.com`,\n\t\t\t\t\tprovider: 'b2',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// f<id>.backblazeb2.com/file/<bucket>\n\t\t\tconst b2Native = host.match(/^f[a-z0-9]+\\.backblazeb2\\.com$/);\n\t\t\tif (b2Native && pathParts[0] === 'file' && pathParts.length > 1) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[1],\n\t\t\t\t\tregion: defaults.region || 'us-west-000',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'b2',\n\t\t\t\t\tprefix: pathParts.slice(2).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Alibaba Cloud OSS ---\n\t\t\t// <bucket>.oss-<region>.aliyuncs.com\n\t\t\tconst ossMatch = host.match(/^(.+)\\.(oss-[a-z0-9-]+)\\.aliyuncs\\.com$/);\n\t\t\tif (ossMatch) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: ossMatch[1],\n\t\t\t\t\tregion: ossMatch[2],\n\t\t\t\t\tendpoint: `${url.protocol}//${ossMatch[2]}.aliyuncs.com`,\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Tencent Cloud COS ---\n\t\t\t// <bucket>.cos.<region>.myqcloud.com\n\t\t\tconst cosMatch = host.match(/^(.+)\\.cos\\.([a-z0-9-]+)\\.myqcloud\\.com$/);\n\t\t\tif (cosMatch) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: cosMatch[1],\n\t\t\t\t\tregion: cosMatch[2],\n\t\t\t\t\tendpoint: `${url.protocol}//cos.${cosMatch[2]}.myqcloud.com`,\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Yandex Cloud ---\n\t\t\t// storage.yandexcloud.net/<bucket>\n\t\t\tif (host === 'storage.yandexcloud.net' && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'ru-central1',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 's3',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Contabo ---\n\t\t\t// <region>.contabostorage.com/<bucket>\n\t\t\tconst contaboMatch = host.match(/^([a-z0-9]+)\\.contabostorage\\.com$/);\n\t\t\tif (contaboMatch && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: contaboMatch[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'contabo',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Hetzner ---\n\t\t\t// <region>.your-objectstorage.com/<bucket>\n\t\t\tconst hetznerMatch = host.match(/^([a-z0-9]+)\\.your-objectstorage\\.com$/);\n\t\t\tif (hetznerMatch && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: hetznerMatch[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'hetzner',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Linode / Akamai ---\n\t\t\t// <bucket>.<region>.linodeobjects.com or <region>.linodeobjects.com/<bucket>\n\t\t\tconst linodeVhost = host.match(/^(.+)\\.([a-z0-9-]+)\\.linodeobjects\\.com$/);\n\t\t\tif (linodeVhost) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: linodeVhost[1],\n\t\t\t\t\tregion: linodeVhost[2],\n\t\t\t\t\tendpoint: `${url.protocol}//${linodeVhost[2]}.linodeobjects.com`,\n\t\t\t\t\tprovider: 'linode',\n\t\t\t\t\tprefix: pathParts.join('/')\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst linodePath = host.match(/^([a-z0-9-]+)\\.linodeobjects\\.com$/);\n\t\t\tif (linodePath && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: linodePath[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'linode',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- OVHcloud ---\n\t\t\t// s3.<region>.io.cloud.ovh.net/<bucket>\n\t\t\tconst ovhMatch = host.match(/^s3\\.([a-z0-9-]+)\\.io\\.cloud\\.ovh\\.(?:net|us)$/);\n\t\t\tif (ovhMatch && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: ovhMatch[1],\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'ovhcloud',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- MinIO ---\n\t\t\t// Common patterns: minio.<domain>, localhost with port\n\t\t\tconst isMinioLike =\n\t\t\t\thost.includes('minio') ||\n\t\t\t\thost === 'localhost' ||\n\t\t\t\thost === '127.0.0.1' ||\n\t\t\t\thost.startsWith('192.168.') ||\n\t\t\t\thost.startsWith('10.');\n\t\t\tif (isMinioLike && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'us-east-1',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'minio',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Azure Blob Storage ---\n\t\t\t// <account>.blob.core.windows.net/<container>\n\t\t\tconst azureBlob = host.match(/^([a-z0-9]+)\\.blob\\.core\\.windows\\.net$/);\n\t\t\tif (azureBlob && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || '',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'azure',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Storj ---\n\t\t\t// S3 gateway: gateway.storjshare.io/<bucket> (or gateway.<region>.storjshare.io)\n\t\t\tconst storjGateway = host.match(/^gateway\\.(?:([a-z0-9]+)\\.)?storjshare\\.io$/);\n\t\t\tif (storjGateway && pathParts.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: storjGateway[1] || defaults.region || 'us1',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}`,\n\t\t\t\t\tprovider: 'storj',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Linksharing: link.storjshare.io/raw/<access>/<bucket>/... or /s/<access>/<bucket>/...\n\t\t\tconst storjLink = host.match(/^link\\.(?:([a-z0-9]+)\\.)?storjshare\\.io$/);\n\t\t\tif (storjLink && pathParts.length >= 3 && (pathParts[0] === 'raw' || pathParts[0] === 's')) {\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[2],\n\t\t\t\t\tregion: storjLink[1] || defaults.region || 'us1',\n\t\t\t\t\tendpoint: `${url.protocol}//${url.host}/${pathParts[0]}/${pathParts[1]}`,\n\t\t\t\t\tprovider: 'storj',\n\t\t\t\t\tprefix: pathParts.slice(3).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// --- Generic custom endpoint with bucket in path ---\n\t\t\tif (pathParts.length > 0) {\n\t\t\t\tconst endpoint = `${url.protocol}//${url.host}`;\n\t\t\t\treturn {\n\t\t\t\t\tbucket: pathParts[0],\n\t\t\t\t\tregion: defaults.region || 'us-east-1',\n\t\t\t\t\tendpoint,\n\t\t\t\t\tprovider: defaults.provider || 's3',\n\t\t\t\t\tprefix: pathParts.slice(1).join('/')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Just a host, no path — treat as endpoint with no bucket\n\t\t\treturn {\n\t\t\t\t...defaultResult(defaults),\n\t\t\t\tendpoint: `${url.protocol}//${url.host}`\n\t\t\t};\n\t\t} catch {\n\t\t\t// Not a valid URL, fall through to plain bucket name\n\t\t}\n\t}\n\n\t// ── Plain bucket name (no protocol) ─────────────────────────────\n\tconst cleaned = trimmed.replace(/^\\/+|\\/+$/g, '');\n\treturn {\n\t\tbucket: cleaned,\n\t\tregion: defaults.region || 'us-east-1',\n\t\tendpoint: defaults.endpoint || '',\n\t\tprovider: defaults.provider || 's3',\n\t\tprefix: ''\n\t};\n}\n\n/**\n * Returns true if the input looks like a URL/URI rather than a plain bucket name.\n * Covers all recognized cloud storage URI schemes.\n */\nexport function looksLikeUrl(input: string): boolean {\n\tconst lower = input.trim().toLowerCase();\n\tif (lower.startsWith('http://') || lower.startsWith('https://')) return true;\n\tfor (const scheme of Object.keys(SCHEME_MAP)) {\n\t\tif (lower.startsWith(scheme)) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Given a parsed URL result, build a human-readable summary of what was detected.\n */\nexport function describeParseResult(parsed: ParsedStorageUrl): string {\n\tconst parts: string[] = [];\n\tif (parsed.bucket) parts.push(`bucket=\"${parsed.bucket}\"`);\n\tif (parsed.endpoint) parts.push(`endpoint=\"${parsed.endpoint}\"`);\n\tif (parsed.region && parsed.region !== 'us-east-1') parts.push(`region=\"${parsed.region}\"`);\n\tif (parsed.provider !== 's3') parts.push(`provider=${parsed.provider}`);\n\tif (parsed.prefix) parts.push(`prefix=\"${parsed.prefix}\"`);\n\treturn parts.length > 0 ? `Detected: ${parts.join(', ')}` : '';\n}\n","/**\n * Lightweight WKB (Well-Known Binary) parser for extracting coordinates.\n * Supports Point, LineString, Polygon, and Multi* variants.\n * Handles standard WKB, ISO WKB (with Z/M), and EWKB (PostGIS SRID).\n */\n\nexport type GeoType =\n\t| 'Point'\n\t| 'LineString'\n\t| 'Polygon'\n\t| 'MultiPoint'\n\t| 'MultiLineString'\n\t| 'MultiPolygon'\n\t| 'Unknown';\n\nexport interface ParsedGeometry {\n\ttype: GeoType;\n\tcoordinates: number[] | number[][] | number[][][] | number[][][][];\n}\n\n// WKB type codes\nconst WKB_POINT = 1;\nconst WKB_LINESTRING = 2;\nconst WKB_POLYGON = 3;\nconst WKB_MULTIPOINT = 4;\nconst WKB_MULTILINESTRING = 5;\nconst WKB_MULTIPOLYGON = 6;\n\n// EWKB flags\nconst EWKB_Z_FLAG = 0x80000000;\nconst EWKB_M_FLAG = 0x40000000;\nconst EWKB_SRID_FLAG = 0x20000000;\n\n/**\n * Normalize binary data from various formats to Uint8Array.\n * Handles Uint8Array, ArrayBuffer, number arrays, hex strings,\n * and DuckDB toJSON() blob objects ({0: byte, 1: byte, ...}).\n */\nexport function toBinary(value: unknown): Uint8Array | null {\n\tif (value === null || value === undefined) return null;\n\tif (value instanceof Uint8Array) return value;\n\tif (value instanceof ArrayBuffer) return new Uint8Array(value);\n\tif (Array.isArray(value) && value.length > 0 && typeof value[0] === 'number') {\n\t\treturn new Uint8Array(value);\n\t}\n\tif (typeof value === 'string' && /^[0-9a-fA-F]+$/.test(value) && value.length % 2 === 0) {\n\t\tconst bytes = new Uint8Array(value.length / 2);\n\t\tfor (let i = 0; i < value.length; i += 2) {\n\t\t\tbytes[i / 2] = parseInt(value.substring(i, i + 2), 16);\n\t\t}\n\t\treturn bytes;\n\t}\n\t// DuckDB toJSON() serializes BLOB/GEOMETRY as {\"0\": byte, \"1\": byte, ...}\n\tif (typeof value === 'object' && !Array.isArray(value)) {\n\t\tconst obj = value as Record<string, number>;\n\t\tconst keys = Object.keys(obj);\n\t\tif (keys.length > 4 && typeof obj['0'] === 'number') {\n\t\t\tconst arr = new Uint8Array(keys.length);\n\t\t\tfor (let i = 0; i < keys.length; i++) arr[i] = obj[i];\n\t\t\treturn arr;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Parse a WKB binary blob into coordinates and geometry type.\n */\nexport function parseWKB(data: Uint8Array): ParsedGeometry | null {\n\tif (data.length < 5) return null;\n\ttry {\n\t\treturn readGeometry(new DataView(data.buffer, data.byteOffset, data.byteLength), 0).geometry;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction readGeometry(\n\tview: DataView,\n\toffset: number\n): { geometry: ParsedGeometry; offset: number } {\n\tconst le = view.getUint8(offset) === 1;\n\toffset += 1;\n\n\tlet typeInt = view.getUint32(offset, le);\n\toffset += 4;\n\n\t// Detect coordinate dimensions from EWKB flags or ISO type ranges\n\tconst hasZ =\n\t\t(typeInt & EWKB_Z_FLAG) !== 0 ||\n\t\t(typeInt % 10000 >= 1000 && typeInt % 10000 < 2000) ||\n\t\t(typeInt % 10000 >= 3000 && typeInt % 10000 < 4000);\n\tconst hasM =\n\t\t(typeInt & EWKB_M_FLAG) !== 0 ||\n\t\t(typeInt % 10000 >= 2000 && typeInt % 10000 < 3000) ||\n\t\t(typeInt % 10000 >= 3000 && typeInt % 10000 < 4000);\n\n\t// Skip SRID if present (EWKB)\n\tif (typeInt & EWKB_SRID_FLAG) offset += 4;\n\n\t// Strip all flags to get base geometry type\n\ttypeInt = (typeInt & 0x0000ffff) % 1000;\n\n\tconst extraDims = (hasZ ? 1 : 0) + (hasM ? 1 : 0);\n\tconst rd = (o: number) => view.getFloat64(o, le);\n\tconst ru = (o: number) => view.getUint32(o, le);\n\n\tfunction readPoint(off: number): { coords: number[]; offset: number } {\n\t\tconst x = rd(off);\n\t\tconst y = rd(off + 8);\n\t\treturn { coords: [x, y], offset: off + 16 + extraDims * 8 };\n\t}\n\n\tfunction readLineString(off: number): { coords: number[][]; offset: number } {\n\t\tconst n = ru(off);\n\t\toff += 4;\n\t\tconst coords: number[][] = [];\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tconst pt = readPoint(off);\n\t\t\tcoords.push(pt.coords);\n\t\t\toff = pt.offset;\n\t\t}\n\t\treturn { coords, offset: off };\n\t}\n\n\tfunction readPolygon(off: number): { coords: number[][][]; offset: number } {\n\t\tconst n = ru(off);\n\t\toff += 4;\n\t\tconst coords: number[][][] = [];\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tconst ring = readLineString(off);\n\t\t\tcoords.push(ring.coords);\n\t\t\toff = ring.offset;\n\t\t}\n\t\treturn { coords, offset: off };\n\t}\n\n\tswitch (typeInt) {\n\t\tcase WKB_POINT: {\n\t\t\tconst pt = readPoint(offset);\n\t\t\treturn { geometry: { type: 'Point', coordinates: pt.coords }, offset: pt.offset };\n\t\t}\n\t\tcase WKB_LINESTRING: {\n\t\t\tconst ls = readLineString(offset);\n\t\t\treturn { geometry: { type: 'LineString', coordinates: ls.coords }, offset: ls.offset };\n\t\t}\n\t\tcase WKB_POLYGON: {\n\t\t\tconst pg = readPolygon(offset);\n\t\t\treturn { geometry: { type: 'Polygon', coordinates: pg.coords }, offset: pg.offset };\n\t\t}\n\t\tcase WKB_MULTIPOINT: {\n\t\t\tconst n = ru(offset);\n\t\t\toffset += 4;\n\t\t\tconst coords: number[][] = [];\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tconst r = readGeometry(view, offset);\n\t\t\t\tcoords.push(r.geometry.coordinates as number[]);\n\t\t\t\toffset = r.offset;\n\t\t\t}\n\t\t\treturn { geometry: { type: 'MultiPoint', coordinates: coords }, offset };\n\t\t}\n\t\tcase WKB_MULTILINESTRING: {\n\t\t\tconst n = ru(offset);\n\t\t\toffset += 4;\n\t\t\tconst coords: number[][][] = [];\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tconst r = readGeometry(view, offset);\n\t\t\t\tcoords.push(r.geometry.coordinates as number[][]);\n\t\t\t\toffset = r.offset;\n\t\t\t}\n\t\t\treturn { geometry: { type: 'MultiLineString', coordinates: coords }, offset };\n\t\t}\n\t\tcase WKB_MULTIPOLYGON: {\n\t\t\tconst n = ru(offset);\n\t\t\toffset += 4;\n\t\t\tconst coords: number[][][][] = [];\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tconst r = readGeometry(view, offset);\n\t\t\t\tcoords.push(r.geometry.coordinates as number[][][]);\n\t\t\t\toffset = r.offset;\n\t\t\t}\n\t\t\treturn { geometry: { type: 'MultiPolygon', coordinates: coords }, offset };\n\t\t}\n\t\tdefault:\n\t\t\treturn { geometry: { type: 'Unknown', coordinates: [] }, offset };\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Geometry column detection\n// ---------------------------------------------------------------------------\n\n/** Exact well-known geometry column names (lowercase for comparison). */\nconst GEO_NAMES = [\n\t'geometry',\n\t'geom',\n\t'wkb_geometry',\n\t'the_geom',\n\t'shape',\n\t'geo',\n\t'wkt_geometry',\n\t'the_geog',\n\t'geog',\n\t'way',\n\t'ora_geometry'\n];\n\n/** Type keywords that indicate a geometry column. */\nconst GEO_TYPE_KEYWORDS = [\n\t'geometry',\n\t'geography',\n\t'wkb',\n\t'point',\n\t'linestring',\n\t'polygon',\n\t'multipoint',\n\t'multilinestring',\n\t'multipolygon',\n\t'geometrycollection',\n\t'sdo_geometry'\n];\n\n/** Substrings in column names that hint at geometry content. */\nconst GEO_NAME_HINTS = ['geom', 'geometry', 'geo_', '_geo', 'wkb', 'wkt', 'shape', 'spatial'];\n\n/** Valid GeoJSON geometry type names. */\nconst GEOJSON_TYPES = [\n\t'Point',\n\t'LineString',\n\t'Polygon',\n\t'MultiPoint',\n\t'MultiLineString',\n\t'MultiPolygon'\n];\n\n/** Check if a value is a GeoJSON geometry object ({type, coordinates}). */\nfunction isGeoJSONGeometry(value: unknown): value is { type: GeoType; coordinates: unknown } {\n\tif (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\tconst obj = value as Record<string, unknown>;\n\treturn (\n\t\ttypeof obj.type === 'string' && GEOJSON_TYPES.includes(obj.type) && obj.coordinates != null\n\t);\n}\n\n/**\n * Find the geometry column name from a schema.\n *\n * Detection priority:\n * 1. Column type contains a geometry keyword (GEOMETRY, POINT, WKB, etc.)\n * 2. Exact well-known column name with BLOB/BINARY type\n * 3. Exact well-known column name regardless of type\n * 4. Column name contains a geo-related substring with BLOB/BINARY type\n * 5. Column name contains a geo-related substring regardless of type\n */\nexport function findGeoColumn(schema: { name: string; type: string }[]): string | null {\n\t// Priority 1: column type contains a geometry keyword\n\t// Skip STRUCT/MAP/LIST types — their field names can false-positive\n\t// (e.g. STRUCT(... Geometry VARCHAR ...) matches 'geometry')\n\tfor (const f of schema) {\n\t\tconst t = f.type.toLowerCase();\n\t\tif (t.startsWith('struct') || t.startsWith('map') || t.startsWith('list')) continue;\n\t\tif (GEO_TYPE_KEYWORDS.some((kw) => t.includes(kw))) return f.name;\n\t}\n\n\t// Priority 2: exact well-known name with binary type\n\tfor (const f of schema) {\n\t\tconst n = f.name.toLowerCase();\n\t\tconst t = f.type.toLowerCase();\n\t\tconst isBinary = t.includes('blob') || t.includes('binary') || t.includes('bytea');\n\t\tif (GEO_NAMES.includes(n) && isBinary) return f.name;\n\t}\n\n\t// Priority 3: exact well-known name, any type\n\tfor (const f of schema) {\n\t\tif (GEO_NAMES.includes(f.name.toLowerCase())) return f.name;\n\t}\n\n\t// Priority 4: name contains geo hint with binary type\n\tfor (const f of schema) {\n\t\tconst n = f.name.toLowerCase();\n\t\tconst t = f.type.toLowerCase();\n\t\tconst isBinary = t.includes('blob') || t.includes('binary') || t.includes('bytea');\n\t\tif (isBinary && GEO_NAME_HINTS.some((hint) => n.includes(hint))) return f.name;\n\t}\n\n\t// Priority 5: name contains geo hint, any type\n\tfor (const f of schema) {\n\t\tconst n = f.name.toLowerCase();\n\t\tif (GEO_NAME_HINTS.some((hint) => n.includes(hint))) return f.name;\n\t}\n\n\treturn null;\n}\n\n/**\n * Check if a value looks like valid WKB by inspecting its first bytes.\n * WKB starts with a byte-order marker (0x00 big-endian, 0x01 little-endian)\n * followed by a uint32 geometry type code.\n */\nfunction looksLikeWKB(value: unknown): boolean {\n\tconst bytes = toBinary(value);\n\tif (!bytes || bytes.length < 5) return false;\n\n\tconst bom = bytes[0];\n\tif (bom !== 0x00 && bom !== 0x01) return false;\n\n\tconst le = bom === 0x01;\n\tconst view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\tlet typeInt = view.getUint32(1, le);\n\n\t// Strip EWKB flags\n\ttypeInt = (typeInt & 0x0000ffff) % 1000;\n\n\t// Valid base geometry types are 1–7\n\treturn typeInt >= 1 && typeInt <= 7;\n}\n\n/**\n * Fallback: probe actual row data to find a column containing WKB geometry.\n * Use this when schema-only detection via `findGeoColumn()` returns null.\n * Samples the first row and checks each BLOB/binary column for WKB magic bytes.\n */\nexport function findGeoColumnFromRows(\n\trows: Record<string, unknown>[],\n\tschema: { name: string; type: string }[]\n): string | null {\n\tif (rows.length === 0) return null;\n\n\tconst sample = rows[0];\n\n\t// First pass: check binary-typed columns\n\tfor (const f of schema) {\n\t\tconst t = f.type.toLowerCase();\n\t\tconst isBinary = t.includes('blob') || t.includes('binary') || t.includes('bytea');\n\t\tif (isBinary && looksLikeWKB(sample[f.name])) return f.name;\n\t}\n\n\t// Second pass: check any column that holds binary-like data or WKT strings\n\tfor (const [key, value] of Object.entries(sample)) {\n\t\tif (value instanceof Uint8Array || value instanceof ArrayBuffer) {\n\t\t\tif (looksLikeWKB(value)) return key;\n\t\t}\n\t\tif (typeof value === 'string') {\n\t\t\t// Hex-encoded WKB\n\t\t\tif (/^[0-9a-fA-F]+$/.test(value) && value.length >= 10 && looksLikeWKB(value)) {\n\t\t\t\treturn key;\n\t\t\t}\n\t\t\t// WKT string (from DuckDB spatial GEOMETRY type)\n\t\t\tif (isWKT(value)) return key;\n\t\t}\n\t\t// GeoJSON geometry object (from DuckDB read_json_auto struct serialization)\n\t\tif (isGeoJSONGeometry(value)) return key;\n\t\t// GeoJSON JSON string (from DuckDB to_json()::VARCHAR)\n\t\tif (typeof value === 'string' && value.startsWith('{')) {\n\t\t\ttry {\n\t\t\t\tif (isGeoJSONGeometry(JSON.parse(value))) return key;\n\t\t\t} catch {\n\t\t\t\t// not JSON\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\n// ---------------------------------------------------------------------------\n// WKT detection (used by findGeoColumnFromRows for column sniffing)\n// ---------------------------------------------------------------------------\n\nconst WKT_TYPES = [\n\t'POINT',\n\t'LINESTRING',\n\t'POLYGON',\n\t'MULTIPOINT',\n\t'MULTILINESTRING',\n\t'MULTIPOLYGON'\n];\n\n/** Check if a string looks like WKT. */\nfunction isWKT(value: unknown): value is string {\n\tif (typeof value !== 'string') return false;\n\tconst s = value.trimStart().toUpperCase();\n\treturn WKT_TYPES.some((t) => s.startsWith(t) || s.startsWith(`MULTI${t}`));\n}\n"]}
|