@walkthru-earth/objex-utils 1.1.0 → 1.2.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 +46 -39
- package/dist/index.cjs +48 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +65 -8
- package/dist/index.d.ts +65 -8
- package/dist/index.js +44 -5
- package/dist/index.js.map +1 -1
- package/docs/README.md +102 -0
- package/docs/cog.md +303 -0
- package/docs/errors.md +34 -0
- package/docs/file-sort.md +67 -0
- package/docs/file-types.md +141 -0
- package/docs/formatting.md +192 -0
- package/docs/geometry.md +198 -0
- package/docs/local-storage.md +51 -0
- package/docs/markdown-sql.md +109 -0
- package/docs/parquet-metadata.md +133 -0
- package/docs/query-engine.md +140 -0
- package/docs/storage.md +251 -0
- package/docs/types-constants.md +173 -0
- package/package.json +2 -1
package/dist/index.cjs.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/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","Field","Float64","FixedSizeList","makeData","List","Utf8","Schema","Struct","RecordBatch","Table","globalBounds","YAML"],"mappings":"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","file":"index.cjs","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"]}
|
|
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/cog.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","Field","Float64","FixedSizeList","makeData","List","Utf8","Schema","Struct","RecordBatch","Table","globalBounds"],"mappings":"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","file":"index.cjs","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/**\n * Default target CRS for ST_Transform. Uses OGC:CRS84 (longitude, latitude)\n * to match GeoParquet 1.1+ spec and DuckDB v1.5's canonical form.\n * Functionally equivalent to EPSG:4326 under `geometry_always_xy = true`.\n */\nexport const DEFAULT_TARGET_CRS = 'OGC:CRS84';\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'.ducklake': {\n\t\ticon: 'Database',\n\t\tcolor: 'text-teal-600 dark:text-teal-400',\n\t\tlabel: 'DuckLake',\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', '.ducklake']);\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 { DEFAULT_INFO, FOLDER_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\n/**\n * Abstraction over a DuckDB query source. Decouples schema / CRS / count\n * helpers from assuming a file-backed path. `ref` is the FROM-clause target\n * inserted into generated SQL (e.g. `read_parquet('url')` for files, or\n * `attached_db.\"schema\".\"table\"` for attached databases). `filePath` is\n * optional and only used as a shortcut for Parquet file-level metadata\n * queries (`parquet_kv_metadata`, `parquet_file_metadata`), not for SQL.\n */\nexport interface QuerySource {\n\tref: string;\n\tfilePath?: string;\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, source: QuerySource): Promise<SchemaField[]>;\n\tgetRowCount(connId: string, source: QuerySource): Promise<number>;\n\t/** Detect CRS from GeoParquet metadata. Returns e.g. 'EPSG:27700' or null if WGS84/unknown. */\n\tdetectCrs(connId: string, source: QuerySource, 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\tsource: QuerySource,\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\t/** Register a file buffer in DuckDB-WASM's virtual filesystem for ATTACH. */\n\tregisterFileBuffer?(name: string, buffer: Uint8Array): Promise<void>;\n\t/** Drop a previously registered file from DuckDB-WASM's virtual filesystem. */\n\tdropFile?(name: string): 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// CORS help — provider-specific browser access guidance\n// ---------------------------------------------------------------------------\n\nexport interface CorsHelp {\n\t/** True if the provider returns CORS headers by default. */\n\tdefaultEnabled: boolean;\n\t/** Official CORS configuration docs URL. */\n\tdocsUrl?: string;\n\t/** Brief note shown in the UI. */\n\tnote?: string;\n\t/** CLI steps when no console UI or docs are insufficient. */\n\tcliSteps?: string[];\n}\n\nexport const CORS_HELP: Record<ProviderId, CorsHelp> = {\n\ts3: {\n\t\tdefaultEnabled: false,\n\t\tdocsUrl: 'https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html',\n\t\tnote: 'Enable via S3 Console: Bucket > Permissions > CORS, or use the AWS CLI.'\n\t},\n\tgcs: {\n\t\tdefaultEnabled: false,\n\t\tdocsUrl: 'https://cloud.google.com/storage/docs/using-cors',\n\t\tnote: 'CORS cannot be configured via the Cloud Console. Use the gcloud CLI.',\n\t\tcliSteps: [\n\t\t\t'Create a cors.json file:\\n[\\n {\\n \"origin\": [\"*\"],\\n \"method\": [\"GET\", \"HEAD\"],\\n \"responseHeader\": [\\n \"Content-Type\",\\n \"Content-Length\",\\n \"Content-Range\",\\n \"Accept-Ranges\",\\n \"ETag\"\\n ],\\n \"maxAgeSeconds\": 3600\\n }\\n]',\n\t\t\t'gcloud storage buckets update gs://BUCKET --cors-file=cors.json'\n\t\t]\n\t},\n\tr2: {\n\t\tdefaultEnabled: false,\n\t\tdocsUrl: 'https://developers.cloudflare.com/r2/buckets/cors/',\n\t\tnote: 'Enable via R2 Dashboard: Bucket > Settings > CORS Policy.'\n\t},\n\tazure: {\n\t\tdefaultEnabled: false,\n\t\tdocsUrl:\n\t\t\t'https://learn.microsoft.com/en-us/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services',\n\t\tnote: 'Enable via Azure Portal: Storage Account > Blob Service > CORS, or use the Azure CLI.',\n\t\tcliSteps: [\n\t\t\t'az storage cors add --services b --methods GET HEAD \\\\\\n --origins \"*\" --allowed-headers \"*\" \\\\\\n --exposed-headers \"*\" --max-age 3600 \\\\\\n --account-name ACCOUNT'\n\t\t]\n\t},\n\tminio: {\n\t\tdefaultEnabled: true,\n\t\tdocsUrl: 'https://docs.min.io/enterprise/aistor-object-store/reference/cli/mc-cors/',\n\t\tnote: 'MinIO allows all origins by default. For custom rules, use mc cors set.'\n\t},\n\tstorj: {\n\t\tdefaultEnabled: true,\n\t\tnote: 'Storj S3 gateway returns CORS headers by default.'\n\t},\n\tb2: {\n\t\tdefaultEnabled: false,\n\t\tdocsUrl: 'https://www.backblaze.com/docs/cloud-storage-cross-origin-resource-sharing-rules',\n\t\tnote: 'Enable via B2 Console: Bucket Settings > CORS Rules, or use the B2 CLI.',\n\t\tcliSteps: [\n\t\t\t'b2 bucket update --cors-rules \\'[{\\n \"corsRuleName\": \"allow-all\",\\n \"allowedOrigins\": [\"*\"],\\n \"allowedOperations\": [\"s3_head\", \"s3_get\"],\\n \"allowedHeaders\": [\"*\"],\\n \"maxAgeSeconds\": 3600\\n}]\\' BUCKET allPublic'\n\t\t]\n\t},\n\tdigitalocean: {\n\t\tdefaultEnabled: false,\n\t\tdocsUrl: 'https://docs.digitalocean.com/products/spaces/how-to/configure-cors/',\n\t\tnote: 'Enable via Control Panel: Space > Settings > CORS Configurations.'\n\t},\n\twasabi: {\n\t\tdefaultEnabled: true,\n\t\tdocsUrl: 'https://docs.wasabi.com/docs/bucket-policy',\n\t\tnote: 'Wasabi returns CORS headers by default for all buckets.'\n\t},\n\tcontabo: {\n\t\tdefaultEnabled: false,\n\t\tnote: 'S3-compatible CORS via the AWS CLI.',\n\t\tcliSteps: [\n\t\t\t'Create a cors.json file:\\n{\\n \"CORSRules\": [{\\n \"AllowedOrigins\": [\"*\"],\\n \"AllowedMethods\": [\"GET\", \"HEAD\"],\\n \"AllowedHeaders\": [\"*\"],\\n \"ExposeHeaders\": [\"ETag\", \"Content-Length\", \"Content-Type\", \"Content-Range\", \"Accept-Ranges\"],\\n \"MaxAgeSeconds\": 3600\\n }]\\n}',\n\t\t\t'aws s3api put-bucket-cors --bucket BUCKET \\\\\\n --cors-configuration file://cors.json \\\\\\n --endpoint-url https://REGION.contaboobj.com'\n\t\t]\n\t},\n\thetzner: {\n\t\tdefaultEnabled: false,\n\t\tdocsUrl: 'https://docs.hetzner.com/storage/object-storage/howto-protect-objects/cors/',\n\t\tnote: 'S3-compatible CORS via the AWS CLI.',\n\t\tcliSteps: [\n\t\t\t'Create a cors.json file:\\n{\\n \"CORSRules\": [{\\n \"AllowedOrigins\": [\"*\"],\\n \"AllowedMethods\": [\"GET\", \"HEAD\"],\\n \"AllowedHeaders\": [\"*\"],\\n \"ExposeHeaders\": [\"ETag\", \"Content-Length\", \"Content-Type\", \"Content-Range\", \"Accept-Ranges\"],\\n \"MaxAgeSeconds\": 3600\\n }]\\n}',\n\t\t\t'aws s3api put-bucket-cors --bucket BUCKET \\\\\\n --cors-configuration file://cors.json \\\\\\n --endpoint-url https://REGION.your-objectstorage.com \\\\\\n --region REGION'\n\t\t]\n\t},\n\tlinode: {\n\t\tdefaultEnabled: false,\n\t\tdocsUrl: 'https://www.linode.com/docs/guides/working-with-cors-linode-object-storage/',\n\t\tnote: 'S3-compatible CORS via the AWS CLI.',\n\t\tcliSteps: [\n\t\t\t'Create a cors.json file:\\n{\\n \"CORSRules\": [{\\n \"AllowedOrigins\": [\"*\"],\\n \"AllowedMethods\": [\"GET\", \"HEAD\"],\\n \"AllowedHeaders\": [\"*\"],\\n \"ExposeHeaders\": [\"ETag\", \"Content-Length\", \"Content-Type\", \"Content-Range\", \"Accept-Ranges\"],\\n \"MaxAgeSeconds\": 3600\\n }]\\n}',\n\t\t\t'aws s3api put-bucket-cors --bucket BUCKET \\\\\\n --cors-configuration file://cors.json \\\\\\n --endpoint-url https://REGION.linodeobjects.com'\n\t\t]\n\t},\n\tovhcloud: {\n\t\tdefaultEnabled: false,\n\t\tdocsUrl:\n\t\t\t'https://help.ovhcloud.com/csm/en-public-cloud-storage-s3-cors?id=kb_article_view&sysparm_article=KB0058291',\n\t\tnote: 'S3-compatible CORS via the AWS CLI.',\n\t\tcliSteps: [\n\t\t\t'Create a cors.json file:\\n{\\n \"CORSRules\": [{\\n \"AllowedOrigins\": [\"*\"],\\n \"AllowedMethods\": [\"GET\", \"HEAD\"],\\n \"AllowedHeaders\": [\"*\"],\\n \"ExposeHeaders\": [\"ETag\", \"Content-Length\", \"Content-Type\", \"Content-Range\", \"Accept-Ranges\"],\\n \"MaxAgeSeconds\": 3600\\n }]\\n}',\n\t\t\t'aws s3api put-bucket-cors --bucket BUCKET \\\\\\n --cors-configuration file://cors.json \\\\\\n --endpoint-url https://s3.REGION.io.cloud.ovh.net'\n\t\t]\n\t}\n};\n\n// ---------------------------------------------------------------------------\n// Read-only access help — provider-specific bucket policy guidance\n// ---------------------------------------------------------------------------\n\nexport interface ReadOnlyHelp {\n\t/** Brief note shown in the UI. */\n\tnote: string;\n\t/** Official docs URL. */\n\tdocsUrl?: string;\n\t/** CLI steps to apply a read-only bucket policy. */\n\tcliSteps?: string[];\n}\n\nexport const READ_ONLY_HELP: Partial<Record<ProviderId, ReadOnlyHelp>> = {\n\ts3: {\n\t\tnote: 'Use IAM policies to create a read-only user, or apply a bucket policy that allows only s3:GetObject and s3:ListBucket.',\n\t\tdocsUrl: 'https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-policies-s3.html'\n\t},\n\tgcs: {\n\t\tnote: 'Assign the Storage Object Viewer role (roles/storage.objectViewer) to the service account.',\n\t\tdocsUrl: 'https://cloud.google.com/storage/docs/access-control/iam-roles'\n\t},\n\tr2: {\n\t\tnote: 'Create an API token with Object Read permissions in the R2 dashboard.',\n\t\tdocsUrl: 'https://developers.cloudflare.com/r2/api/tokens/'\n\t},\n\tazure: {\n\t\tnote: 'Generate a SAS token with Read and List permissions only. Avoid granting Write or Delete.',\n\t\tdocsUrl: 'https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview'\n\t},\n\tb2: {\n\t\tnote: 'Create an application key with readFiles and listBuckets capabilities only.',\n\t\tdocsUrl: 'https://www.backblaze.com/docs/cloud-storage-application-keys'\n\t},\n\thetzner: {\n\t\tnote: 'Keys have full read/write by default. Use a bucket policy with the correct ARN format to deny write and policy actions. To undo, generate a new admin key from the Hetzner Console.',\n\t\tdocsUrl:\n\t\t\t'https://docs.hetzner.com/storage/object-storage/faq/s3-credentials/#how-do-i-restrict-access-per-key',\n\t\tcliSteps: [\n\t\t\t'Find your project ID from the Hetzner Console URL:\\nhttps://console.hetzner.com/projects/<PROJECT_ID>/servers',\n\t\t\t'Create a policy.json file:\\n{\\n \"Version\": \"2012-10-17\",\\n \"Statement\": [\\n {\\n \"Sid\": \"DenyWrites\",\\n \"Effect\": \"Deny\",\\n \"Principal\": {\\n \"AWS\": \"arn:aws:iam:::user/p<PROJECT_ID>:<ACCESS_KEY>\"\\n },\\n \"Action\": [\\n \"s3:PutObject\",\\n \"s3:DeleteObject\",\\n \"s3:AbortMultipartUpload\",\\n \"s3:PutBucketPolicy\",\\n \"s3:DeleteBucketPolicy\"\\n ],\\n \"Resource\": [\\n \"arn:aws:s3:::BUCKET\",\\n \"arn:aws:s3:::BUCKET/*\"\\n ]\\n }\\n ]\\n}',\n\t\t\t'aws s3api put-bucket-policy --bucket BUCKET \\\\\\n --policy file://policy.json \\\\\\n --endpoint-url https://REGION.your-objectstorage.com \\\\\\n --region REGION',\n\t\t\t'Note: This key can no longer modify the policy.\\nTo restore write access, generate a new key in the\\nHetzner Console and use it to delete the policy.'\n\t\t]\n\t},\n\tminio: {\n\t\tnote: 'Create a read-only policy with mc admin policy, or use the built-in readonly canned policy.',\n\t\tdocsUrl: 'https://docs.min.io/enterprise/aistor-object-store/administration/iam/access/'\n\t},\n\tdigitalocean: {\n\t\tnote: 'Spaces keys are project-wide. Use a bucket policy to restrict write actions for a specific key.',\n\t\tdocsUrl: 'https://docs.digitalocean.com/products/spaces/how-to/manage-access/'\n\t},\n\twasabi: {\n\t\tnote: 'Create a sub-user with a read-only policy in the Wasabi Console.',\n\t\tdocsUrl: 'https://docs.wasabi.com/docs/creating-a-user-account-and-access-key'\n\t},\n\tcontabo: {\n\t\tnote: 'S3-compatible bucket policies. Use a Deny policy for write actions with the key ARN.',\n\t\tcliSteps: [\n\t\t\t'Create a policy.json with a Deny statement for s3:PutObject and s3:DeleteObject.',\n\t\t\t'aws s3api put-bucket-policy --bucket BUCKET \\\\\\n --policy file://policy.json \\\\\\n --endpoint-url https://REGION.contaboobj.com'\n\t\t]\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// ---------------------------------------------------------------------------\n// Access mode — single source of truth for how any HTTP client (DuckDB httpfs,\n// COG/Zarr/PMTiles libraries, fetch, img, video) can read files for a given\n// connection. Used by url.ts (URL construction), query/wasm.ts (S3 config\n// short-circuit), canStreamDirectly (viewer routing).\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal connection shape needed to decide access mode.\n * Kept loose so callers don't need to import the full Connection type.\n */\nexport interface AccessModeInput {\n\tprovider: string;\n\tanonymous?: boolean;\n\tendpoint?: string;\n}\n\n/**\n * How a connection's files can be read by the browser:\n *\n * - `public-https`: plain HTTPS via any HTTP client. No auth, no signing.\n * Covers anonymous AWS/GCS/R2/Storj/Wasabi/etc.\n * - `sas-https`: HTTPS with SAS token embedded in the URL. Still works with\n * any HTTP client. Azure only.\n * - `signed-s3`: requires SigV4 signing. DuckDB uses the `s3://` URI and\n * signs it via its S3 config; other viewers must go through the storage\n * adapter (which returns a blob) instead of streaming the HTTPS URL.\n */\nexport type AccessMode = 'public-https' | 'sas-https' | 'signed-s3';\n\nexport function getAccessMode(conn: AccessModeInput): AccessMode {\n\tif (conn.provider === 'azure') return 'sas-https';\n\t// Anonymous buckets: every provider serves files over plain HTTPS without\n\t// signing (AWS path/vhost, GCS, R2 public, Storj, Wasabi, DO, etc.).\n\tif (conn.anonymous) return 'public-https';\n\t// Authenticated: needs SigV4 signing.\n\treturn 'signed-s3';\n}\n\n/**\n * True when the connection's files can be fetched by any HTTP client\n * (fetch/img/video/DuckDB httpfs/COG/Zarr/etc.) without the storage adapter.\n */\nexport function isPubliclyStreamable(conn: AccessModeInput): boolean {\n\tconst mode = getAccessMode(conn);\n\treturn mode === 'public-https' || mode === 'sas-https';\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","import type { GetTileDataOptions, MinimalDataT } from '@developmentseed/deck.gl-geotiff';\nimport { inferRenderPipeline } from '@developmentseed/deck.gl-geotiff';\nimport type { RenderTileResult } from '@developmentseed/deck.gl-raster';\nimport { LinearRescale } from '@developmentseed/deck.gl-raster/gpu-modules';\nimport loadEpsg from '@developmentseed/epsg/all';\nimport epsgCsvUrl from '@developmentseed/epsg/all.csv.gz?url';\nimport type { GeoTIFF as GeoTIFFType, Overview } from '@developmentseed/geotiff';\nimport { GeoTIFF } from '@developmentseed/geotiff';\nimport type { EpsgResolver, ProjectionDefinition } from '@developmentseed/proj';\nimport { parseWkt } from '@developmentseed/proj';\nimport type { Device } from '@luma.gl/core';\nimport type maplibregl from 'maplibre-gl';\nimport proj4Lib from 'proj4';\n\n// ─── Constants ───────────────────────────────────────────────────\n\n/** SampleFormat tag value → human label. */\nexport const SF_LABELS: Record<number, string> = {\n\t1: 'uint',\n\t2: 'int',\n\t3: 'float',\n\t4: 'void',\n\t5: 'complex int',\n\t6: 'complex float'\n};\n\n// ─── Color ramps ─────────────────────────────────────────────────\n\nexport type ColorRampId = 'grayscale' | 'terrain' | 'viridis' | 'magma' | 'turbo' | 'spectral';\n\nexport const COLOR_RAMP_STOPS: Record<ColorRampId, [number, number, number][]> = {\n\tgrayscale: [\n\t\t[0, 0, 0],\n\t\t[255, 255, 255]\n\t],\n\tterrain: [\n\t\t[0, 0, 128],\n\t\t[0, 100, 200],\n\t\t[0, 154, 80],\n\t\t[120, 180, 50],\n\t\t[200, 170, 60],\n\t\t[180, 120, 50],\n\t\t[140, 90, 40],\n\t\t[200, 200, 200],\n\t\t[255, 255, 255]\n\t],\n\tviridis: [\n\t\t[68, 1, 84],\n\t\t[72, 36, 117],\n\t\t[64, 67, 135],\n\t\t[52, 94, 141],\n\t\t[33, 145, 140],\n\t\t[43, 176, 127],\n\t\t[95, 201, 97],\n\t\t[186, 222, 39],\n\t\t[253, 231, 37]\n\t],\n\tmagma: [\n\t\t[0, 0, 4],\n\t\t[22, 11, 57],\n\t\t[67, 15, 98],\n\t\t[114, 24, 114],\n\t\t[161, 48, 104],\n\t\t[206, 82, 83],\n\t\t[237, 132, 62],\n\t\t[251, 192, 75],\n\t\t[252, 253, 191]\n\t],\n\tturbo: [\n\t\t[48, 18, 59],\n\t\t[31, 82, 188],\n\t\t[23, 158, 227],\n\t\t[47, 212, 161],\n\t\t[121, 238, 104],\n\t\t[193, 241, 57],\n\t\t[245, 206, 27],\n\t\t[253, 141, 31],\n\t\t[213, 47, 24]\n\t],\n\tspectral: [\n\t\t[158, 1, 66],\n\t\t[213, 62, 79],\n\t\t[244, 109, 67],\n\t\t[253, 174, 97],\n\t\t[254, 224, 139],\n\t\t[255, 255, 191],\n\t\t[230, 245, 152],\n\t\t[171, 221, 164],\n\t\t[94, 79, 162]\n\t]\n};\n\n/** Interpolate a normalized value (0..1) into an RGB color from a ramp. */\nexport function interpolateRamp(\n\tstops: [number, number, number][],\n\tt: number\n): [number, number, number] {\n\tconst n = stops.length - 1;\n\tconst idx = Math.max(0, Math.min(n, t * n));\n\tconst lo = Math.floor(idx);\n\tconst hi = Math.min(lo + 1, n);\n\tconst f = idx - lo;\n\treturn [\n\t\tMath.round(stops[lo][0] + f * (stops[hi][0] - stops[lo][0])),\n\t\tMath.round(stops[lo][1] + f * (stops[hi][1] - stops[lo][1])),\n\t\tMath.round(stops[lo][2] + f * (stops[hi][2] - stops[lo][2]))\n\t];\n}\n\n/** Generate a CSS linear-gradient string for a color ramp. */\nexport function rampToGradientCss(id: ColorRampId): string {\n\tconst stops = COLOR_RAMP_STOPS[id];\n\tconst colors = stops.map(\n\t\t(s, i) => `rgb(${s[0]},${s[1]},${s[2]}) ${((i / (stops.length - 1)) * 100).toFixed(0)}%`\n\t);\n\treturn `linear-gradient(to right, ${colors.join(', ')})`;\n}\n\n// ─── Band configuration ─────────────────────────────────────────\n\nexport interface BandConfig {\n\tmode: 'rgb' | 'single';\n\t/** 0-indexed band indices for RGB channels */\n\trBand: number;\n\tgBand: number;\n\tbBand: number;\n\t/** 0-indexed band index for single-band mode */\n\tband: number;\n\tcolorRamp: ColorRampId;\n}\n\n/** Create a sensible default band config based on COG metadata. */\nexport function defaultBandConfig(bandCount: number, sampleFormat: number): BandConfig {\n\tif (bandCount >= 3) {\n\t\treturn {\n\t\t\tmode: 'rgb',\n\t\t\trBand: 0,\n\t\t\tgBand: 1,\n\t\t\tbBand: 2,\n\t\t\tband: 0,\n\t\t\tcolorRamp: 'viridis'\n\t\t};\n\t}\n\treturn {\n\t\tmode: 'single',\n\t\trBand: 0,\n\t\tgBand: 0,\n\t\tbBand: 0,\n\t\tband: 0,\n\t\tcolorRamp: sampleFormat === 2 || sampleFormat === 3 ? 'terrain' : 'viridis'\n\t};\n}\n\n/** Check if the config matches the default for this COG (no user changes). */\nexport function isDefaultBandConfig(\n\tconfig: BandConfig,\n\tbandCount: number,\n\tsampleFormat: number\n): boolean {\n\tconst def = defaultBandConfig(bandCount, sampleFormat);\n\treturn (\n\t\tconfig.mode === def.mode &&\n\t\tconfig.rBand === def.rBand &&\n\t\tconfig.gBand === def.gBand &&\n\t\tconfig.bBand === def.bBand &&\n\t\tconfig.band === def.band &&\n\t\tconfig.colorRamp === def.colorRamp\n\t);\n}\n\n// ─── TIFF tag inspection ─────────────────────────────────────────\n\nexport interface CogTagInfo {\n\t/** TIFF SampleFormat[0] value. 1=uint, 2=int, 3=float. Defaults to 1 when absent. */\n\tsampleFormat: number;\n\t/** True when SampleFormat[0] === 1 (unsigned integer). */\n\tisUint: boolean;\n\t/**\n\t * True when Photometric === 3 (Palette) and the ColorMap tag is present.\n\t * These COGs should defer to the library's default Colormap GPU module,\n\t * not our custom JS pipeline, so the embedded palette renders correctly.\n\t */\n\tisPaletteIndexed: boolean;\n}\n\n/**\n * Inspect the TIFF tags that drive pipeline selection. Centralizes the\n * Photometric.Palette === 3 magic number and the SampleFormat fallback in one\n * place so viewers don't reimplement raw tag reads. Photometric values come\n * from the @cogeotiff/core Photometric enum.\n */\nexport function inspectCogTags(geotiff: GeoTIFFType): CogTagInfo {\n\tconst tags = geotiff.cachedTags;\n\tconst sampleFormat = tags.sampleFormat?.[0] ?? 1;\n\treturn {\n\t\tsampleFormat,\n\t\tisUint: sampleFormat === 1,\n\t\tisPaletteIndexed: tags.photometric === 3 && Boolean(tags.colorMap)\n\t};\n}\n\n/**\n * Check if a given band config requires a custom pipeline (vs library default).\n * Library default only works for uint with standard RGB band order, or for\n * palette-indexed uint COGs where the embedded ColorMap tag auto-renders.\n */\nexport function needsCustomPipelineForConfig(geotiff: GeoTIFFType, config: BandConfig): boolean {\n\tconst tags = geotiff.cachedTags;\n\tconst sf = tags.sampleFormat;\n\tconst isUint = sf !== null && sf[0] === 1;\n\tif (!isUint) return true;\n\t// Palette-indexed uint COGs with an embedded ColorMap tag are auto-rendered\n\t// by the library via its Colormap GPU module. Defer to the default pipeline\n\t// only while the user has not changed the default band config.\n\t// Photometric.Palette === 3 in @cogeotiff/core.\n\tif (\n\t\ttags.photometric === 3 &&\n\t\ttags.colorMap &&\n\t\tisDefaultBandConfig(config, geotiff.count, sf[0])\n\t) {\n\t\treturn false;\n\t}\n\tif (config.mode === 'single') return true;\n\tif (config.rBand !== 0 || config.gBand !== 1 || config.bBand !== 2) return true;\n\treturn false;\n}\n\n// ─── Linear rescale (GPU shader module, default pipeline only) ───\n\n/**\n * Min/max rescale values applied via the `LinearRescale` shader module. Values\n * are in normalized shader space [0, 1]. Default `{ min: 0, max: 1 }` is a\n * no-op and the library-default pipeline is used as-is.\n */\nexport interface RescaleConfig {\n\tmin: number;\n\tmax: number;\n}\n\nexport const DEFAULT_RESCALE: RescaleConfig = { min: 0, max: 1 };\n\n/** True when the rescale values would produce a visible change on the GPU. */\nexport function isRescaleActive(cfg: RescaleConfig): boolean {\n\treturn cfg.min !== DEFAULT_RESCALE.min || cfg.max !== DEFAULT_RESCALE.max;\n}\n\n/**\n * Build a `getTileData` + `renderTile` pair that reuses the library-default\n * uint pipeline (via `inferRenderPipeline`) and appends `LinearRescale` to the\n * returned render pipeline. Only safe to use when the default pipeline would\n * have been chosen anyway, i.e. `needsCustomPipelineForConfig(geotiff, cfg)`\n * is false. For non-uint or custom band configs the custom JS pipeline already\n * bakes RGBA in CPU and a GPU rescale would be cosmetic.\n *\n * `inferRenderPipeline` needs the GPU `Device` which arrives in the first\n * tile's `GetTileDataOptions`, so the pipeline is built lazily on first call.\n */\nexport function createRescaledPipeline(\n\tgeotiff: GeoTIFFType,\n\trescale: RescaleConfig\n): {\n\tgetTileData: (\n\t\timage: GeoTIFFType | Overview,\n\t\toptions: GetTileDataOptions\n\t) => Promise<MinimalDataT>;\n\trenderTile: (data: MinimalDataT) => RenderTileResult;\n} {\n\tlet builtFor: Device | null = null;\n\tlet defaultGetTileData:\n\t\t| ((image: GeoTIFFType | Overview, options: GetTileDataOptions) => Promise<MinimalDataT>)\n\t\t| null = null;\n\tlet defaultRenderTile: ((data: MinimalDataT) => RenderTileResult) | null = null;\n\n\tfunction ensureBuilt(device: Device): void {\n\t\tif (builtFor === device && defaultGetTileData && defaultRenderTile) return;\n\t\tconst inferred = inferRenderPipeline(geotiff, device);\n\t\t// `inferRenderPipeline` returns generic callbacks. `MinimalDataT` is the\n\t\t// contractual superset used by COGLayer — safe upcast.\n\t\tdefaultGetTileData = inferred.getTileData as unknown as (\n\t\t\timage: GeoTIFFType | Overview,\n\t\t\toptions: GetTileDataOptions\n\t\t) => Promise<MinimalDataT>;\n\t\tdefaultRenderTile = inferred.renderTile as unknown as (data: MinimalDataT) => RenderTileResult;\n\t\tbuiltFor = device;\n\t}\n\n\treturn {\n\t\tgetTileData: async (image, options) => {\n\t\t\tensureBuilt(options.device);\n\t\t\treturn defaultGetTileData!(image, options);\n\t\t},\n\t\trenderTile: (data) => {\n\t\t\tconst base = defaultRenderTile!(data);\n\t\t\tconst pipeline = base.renderPipeline ?? [];\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\trenderPipeline: [\n\t\t\t\t\t...pipeline,\n\t\t\t\t\t{ module: LinearRescale, props: { rescaleMin: rescale.min, rescaleMax: rescale.max } }\n\t\t\t\t]\n\t\t\t};\n\t\t}\n\t};\n}\n\n// ─── GeoTIFF normalization for COGLayer ──────────────────────────\n\n// Web Mercator's safe latitude limit. EPSG:4326 bboxes outside ±85.051129° hit\n// out-of-domain proj4 NaN when the library generates its tile matrix set.\nconst WM_LAT_LIMIT = 85.051129;\n\n/**\n * Apply the two upstream-bug workarounds a GeoTIFF needs before being handed\n * to `COGLayer`:\n * 1. Strip oversized overviews (image smaller than tile size). These produce\n * out-of-domain proj4 NaN during pre-flight reprojection.\n * 2. Clamp EPSG:4326 bbox to Web Mercator's safe range. Global 4326 COGs with\n * ±90° extents crash the tile matrix generator.\n *\n * Mutates the GeoTIFF in place. Safe to call repeatedly. Kept out of the\n * Svelte component so MultiCOG/Mosaic can apply the same fix per sub-COG.\n */\nexport function normalizeCogGeotiff(geotiff: GeoTIFFType): void {\n\tconst validOverviews = geotiff.overviews.filter(\n\t\t(ov) => ov.width >= ov.tileWidth && ov.height >= ov.tileHeight\n\t);\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t(geotiff as any).overviews = validOverviews;\n\n\tif (geotiff.crs === 4326) {\n\t\tconst [x0, y0, x1, y1] = geotiff.bbox;\n\t\tconst clamped = [\n\t\t\tMath.max(x0, -180),\n\t\t\tMath.max(y0, -WM_LAT_LIMIT),\n\t\t\tMath.min(x1, 180),\n\t\t\tMath.min(y1, WM_LAT_LIMIT)\n\t\t] as [number, number, number, number];\n\t\tif (clamped[0] !== x0 || clamped[1] !== y0 || clamped[2] !== x1 || clamped[3] !== y1) {\n\t\t\tObject.defineProperty(geotiff, 'bbox', {\n\t\t\t\tvalue: clamped,\n\t\t\t\twritable: false,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\t\t}\n\t}\n}\n\n// ─── Pipeline dispatch ────────────────────────────────────────────\n\n/**\n * Resolved COGLayer data props. Empty object means \"library default pipeline\".\n * Spread into `new COGLayer({ ..., ...resolved })` to activate.\n *\n * COGLayer's data-prop types are a discriminated XOR and the four pipelines we\n * dispatch to return different DataT shapes (`CustomTileData`, `MinimalDataT`).\n * Typing this as `Record<string, any>` matches the `customProps` pattern\n * already used at the COGLayer boundary and keeps the dispatch site simple.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ResolvedCogPipeline = Record<string, any>;\n\nexport interface SelectCogPipelineOptions {\n\t/** Active band/color config, or null/undefined when not yet resolved. */\n\tbandConfig?: BandConfig | null;\n\t/** Linear rescale GPU module values. No-op when omitted or at defaults. */\n\trescale?: RescaleConfig;\n}\n\n/**\n * Decide which getTileData/renderTile pair COGLayer should use for a GeoTIFF.\n * Four outcomes, in priority order:\n *\n * 1. Custom configurable (band swap, color ramp) — when bandConfig is active\n * and needsCustomPipelineForConfig is true (non-uint, mode=single, or\n * non-standard RGB band order).\n * 2. Custom non-uint (Int/Float source) — when no bandConfig yet but the\n * GeoTIFF itself forces custom handling.\n * 3. Library default + LinearRescale — uint path is fine AND the user moved\n * the rescale slider away from defaults.\n * 4. Library default — returns `{}`, caller spreads into COGLayer props.\n *\n * Pure dispatch. Kept separate from the Svelte component so MultiCOG/Mosaic\n * viewers can call it per sub-COG without re-implementing the decision tree.\n */\nexport function selectCogPipeline(\n\tgeotiff: GeoTIFFType,\n\topts: SelectCogPipelineOptions = {}\n): ResolvedCogPipeline {\n\tconst { bandConfig, rescale } = opts;\n\tconst useCustom = bandConfig\n\t\t? needsCustomPipelineForConfig(geotiff, bandConfig)\n\t\t: needsCustomPipeline(geotiff);\n\n\tif (useCustom && bandConfig) {\n\t\treturn {\n\t\t\tgetTileData: createConfigurableGetTileData(geotiff, bandConfig),\n\t\t\trenderTile: customRenderTile\n\t\t};\n\t}\n\tif (useCustom) {\n\t\treturn {\n\t\t\tgetTileData: createCustomGetTileData(geotiff),\n\t\t\trenderTile: customRenderTile\n\t\t};\n\t}\n\tif (rescale && isRescaleActive(rescale)) {\n\t\tconst pipeline = createRescaledPipeline(geotiff, rescale);\n\t\treturn {\n\t\t\tgetTileData: pipeline.getTileData,\n\t\t\trenderTile: pipeline.renderTile\n\t\t};\n\t}\n\treturn {};\n}\n\nconst BITMAP_SOURCE = 'geotiff-bitmap-src';\nconst BITMAP_LAYER = 'geotiff-bitmap-layer';\n\n// ─── Types ───────────────────────────────────────────────────────\n\nexport interface GeoBounds {\n\twest: number;\n\tsouth: number;\n\teast: number;\n\tnorth: number;\n}\n\nexport interface CogInfo {\n\twidth: number;\n\theight: number;\n\tbandCount: number;\n\tdataType: string;\n\tbounds: GeoBounds;\n\tdownsampled?: boolean;\n}\n\n// ─── Pure helpers ────────────────────────────────────────────────\n\n/** Safely clamp a number to a range, treating NaN/Infinity as the fallback. */\nexport function safeClamp(v: number, lo: number, hi: number, fallback: number): number {\n\treturn Number.isFinite(v) ? Math.max(lo, Math.min(hi, v)) : fallback;\n}\n\n/** Clamp geographic bounds to valid MapLibre web-Mercator range. */\nexport function clampBounds(b: GeoBounds): GeoBounds {\n\treturn {\n\t\twest: safeClamp(b.west, -180, 180, -180),\n\t\tsouth: safeClamp(b.south, -85.051129, 85.051129, -85.051129),\n\t\teast: safeClamp(b.east, -180, 180, 180),\n\t\tnorth: safeClamp(b.north, -85.051129, 85.051129, 85.051129)\n\t};\n}\n\n/**\n * Build a data-type label from GeoTIFF sample format and bits per sample.\n * e.g. \"uint8\", \"float32\", \"int16\"\n */\nexport function buildDataTypeLabel(sampleFormat: number, bitsPerSample: number): string {\n\treturn `${SF_LABELS[sampleFormat] ?? `sf${sampleFormat}`}${bitsPerSample ?? ''}`;\n}\n\n// ─── Map helpers (depend on maplibre-gl) ─────────────────────────\n\n/**\n * Query the GPU's MAX_TEXTURE_SIZE from MapLibre's WebGL context.\n * Falls back to 4096 (lowest common denominator for mobile GPUs).\n */\nexport function getMaxTextureSize(map: maplibregl.Map): number {\n\ttry {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst gl = (map as any).painter?.context?.gl as WebGL2RenderingContext | null;\n\t\tif (gl) return gl.getParameter(gl.MAX_TEXTURE_SIZE) as number;\n\t} catch {\n\t\t/* fallback */\n\t}\n\treturn 4096;\n}\n\n/**\n * Fit the map to COG bounds with responsive padding.\n * Uses smaller padding on mobile to zoom in closer, ensuring overviews load\n * properly instead of appearing black at very low zoom levels.\n * After fitting, bumps zoom +2 when the viewport settles at a very low level.\n */\nexport function fitCogBounds(map: maplibregl.Map, b: GeoBounds): void {\n\tconst isMobile = window.innerWidth < 640;\n\tconst viewportMin = Math.min(window.innerWidth, window.innerHeight);\n\tconst padding = isMobile ? 5 : Math.max(10, Math.round(viewportMin * 0.04));\n\tmap.fitBounds(\n\t\t[\n\t\t\t[b.west, b.south],\n\t\t\t[b.east, b.north]\n\t\t],\n\t\t{ padding, maxZoom: 18, speed: 1.2, maxDuration: 2000 }\n\t);\n\tconst lonSpan = b.east - b.west;\n\tconst latSpan = b.north - b.south;\n\tconst isLargeExtent = lonSpan > 90 || latSpan > 45;\n\tif (!isLargeExtent) {\n\t\tmap.once('moveend', () => {\n\t\t\tconst z = map.getZoom();\n\t\t\tconst minZoom = isMobile ? 10 : 8;\n\t\t\tif (z < minZoom) {\n\t\t\t\tmap.zoomTo(z + 2, { duration: 500 });\n\t\t\t}\n\t\t});\n\t}\n}\n\n/** Remove the native bitmap source/layer from the map (idempotent). */\nexport function cleanupNativeBitmap(map: maplibregl.Map): void {\n\ttry {\n\t\tif (map.getLayer(BITMAP_LAYER)) map.removeLayer(BITMAP_LAYER);\n\t} catch {\n\t\t/* already removed */\n\t}\n\ttry {\n\t\tif (map.getSource(BITMAP_SOURCE)) map.removeSource(BITMAP_SOURCE);\n\t} catch {\n\t\t/* already removed */\n\t}\n}\n\n// ─── Terrain color ramp ──────────────────────────────────────────\n\n/** Terrain-inspired color ramp: deep blue → green → brown → white. */\nconst TERRAIN_RAMP: [number, number, number][] = [\n\t[0, 0, 128], // deep water\n\t[0, 100, 200], // shallow water\n\t[0, 154, 80], // lowland green\n\t[120, 180, 50], // mid green\n\t[200, 170, 60], // savanna\n\t[180, 120, 50], // brown\n\t[140, 90, 40], // dark brown\n\t[200, 200, 200], // rock\n\t[255, 255, 255] // snow / peak\n];\n\n/** Interpolate a 0..1 value into a terrain RGB color. */\nfunction terrainColor(t: number): [number, number, number] {\n\tconst n = TERRAIN_RAMP.length - 1;\n\tconst idx = Math.max(0, Math.min(n, t * n));\n\tconst lo = Math.floor(idx);\n\tconst hi = Math.min(lo + 1, n);\n\tconst f = idx - lo;\n\treturn [\n\t\tMath.round(TERRAIN_RAMP[lo][0] + f * (TERRAIN_RAMP[hi][0] - TERRAIN_RAMP[lo][0])),\n\t\tMath.round(TERRAIN_RAMP[lo][1] + f * (TERRAIN_RAMP[hi][1] - TERRAIN_RAMP[lo][1])),\n\t\tMath.round(TERRAIN_RAMP[lo][2] + f * (TERRAIN_RAMP[hi][2] - TERRAIN_RAMP[lo][2]))\n\t];\n}\n\n// ─── Non-tiled bitmap rendering ──────────────────────────────────\n\n/**\n * Compute geographic bounds (WGS84) from a GeoTIFF's native CRS bbox\n * using edge-sampling for accuracy with non-linear projections.\n */\nasync function computeGeographicBounds(\n\tgeotiff: GeoTIFF,\n\tsignal: AbortSignal\n): Promise<GeoBounds | null> {\n\tconst crs = geotiff.crs;\n\tconst [x0, y0, x1, y1] = geotiff.bbox;\n\n\t// EPSG:4326 — bbox is already geographic\n\tif (crs === 4326) {\n\t\treturn clampBounds({ west: x0, south: y0, east: x1, north: y1 });\n\t}\n\n\t// For other CRS, resolve the projection definition from the bundled EPSG\n\t// database (numeric codes) or fall back to ProjJSON.\n\tlet proj4Def: string;\n\tif (typeof crs === 'number') {\n\t\tconst wkt = await lookupEpsgWkt(crs);\n\t\tif (signal.aborted) return null;\n\t\tif (!wkt) return null;\n\t\tproj4Def = wkt;\n\t} else {\n\t\t// ProjJson — try to pass directly to proj4 (limited support)\n\t\tproj4Def = JSON.stringify(crs);\n\t}\n\n\ttry {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst conv = proj4Lib(proj4Def, 'EPSG:4326') as any;\n\t\tconst N = 4;\n\t\tconst pts: [number, number][] = [];\n\t\tfor (let i = 0; i <= N; i++) {\n\t\t\tconst t = i / N;\n\t\t\tpts.push([x0 + t * (x1 - x0), y0]);\n\t\t\tpts.push([x0 + t * (x1 - x0), y1]);\n\t\t\tpts.push([x0, y0 + t * (y1 - y0)]);\n\t\t\tpts.push([x1, y0 + t * (y1 - y0)]);\n\t\t}\n\t\tlet w = 180;\n\t\tlet s = 90;\n\t\tlet e = -180;\n\t\tlet n = -90;\n\t\tfor (const [px, py] of pts) {\n\t\t\tconst r = conv.forward([px, py], false);\n\t\t\tif (\n\t\t\t\tNumber.isFinite(r[0]) &&\n\t\t\t\tNumber.isFinite(r[1]) &&\n\t\t\t\tMath.abs(r[0]) <= 180 &&\n\t\t\t\tMath.abs(r[1]) <= 90\n\t\t\t) {\n\t\t\t\tw = Math.min(w, r[0]);\n\t\t\t\te = Math.max(e, r[0]);\n\t\t\t\ts = Math.min(s, r[1]);\n\t\t\t\tn = Math.max(n, r[1]);\n\t\t\t}\n\t\t}\n\t\tif (w < e && s < n) {\n\t\t\treturn clampBounds({ west: w, south: s, east: e, north: n });\n\t\t}\n\t} catch {\n\t\t/* proj4 conversion failed */\n\t}\n\treturn null;\n}\n\nconst MAX_NONTILED_PIXELS = 100_000_000;\n\n/**\n * Render a non-tiled GeoTIFF as a MapLibre native image source (bitmap).\n * Opens the file with @developmentseed/geotiff, reads band 0, normalizes\n * to grayscale RGBA, and adds to the map as a raster layer.\n *\n * Returns CogInfo for the metadata panel.\n */\nexport async function renderNonTiledBitmap(options: {\n\turl: string;\n\tmap: maplibregl.Map;\n\tsignal: AbortSignal;\n\tgeotiff?: GeoTIFF;\n}): Promise<CogInfo> {\n\tconst { url, map, signal } = options;\n\n\t// Open GeoTIFF (reuse if already opened for pre-flight)\n\tconst geotiff = options.geotiff ?? (await GeoTIFF.fromUrl(url));\n\tif (signal.aborted) throw new DOMException('Aborted', 'AbortError');\n\n\tconst imgW = geotiff.width;\n\tconst imgH = geotiff.height;\n\tconst totalPixels = imgW * imgH;\n\tconst bandCount = geotiff.count;\n\tconst nodata = geotiff.nodata;\n\n\t// Determine data type from the underlying TIFF image\n\tconst tiffImage = geotiff.image;\n\t// @cogeotiff/core TiffImage stores tag values\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tconst sampleFormat = (tiffImage as any).value?.('SampleFormat')?.[0] ?? 1;\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tconst bitsPerSample = (tiffImage as any).value?.('BitsPerSample')?.[0] ?? 8;\n\tconst dataType = buildDataTypeLabel(sampleFormat, bitsPerSample);\n\n\t// Compute geographic bounds\n\tconst geoBounds = await computeGeographicBounds(geotiff, signal);\n\tif (signal.aborted) throw new DOMException('Aborted', 'AbortError');\n\tif (!geoBounds) {\n\t\tthrow new Error('Cannot determine geographic bounds for non-tiled GeoTIFF');\n\t}\n\n\t// Size gate\n\tif (totalPixels > MAX_NONTILED_PIXELS) {\n\t\tfitCogBounds(map, geoBounds);\n\t\tthrow new Error(\n\t\t\t`Non-tiled GeoTIFF too large (${imgW.toLocaleString()} \\u00d7 ${imgH.toLocaleString()} = ` +\n\t\t\t\t`${(totalPixels / 1e6).toFixed(0)}M pixels). Convert to COG: ` +\n\t\t\t\t`gdal_translate -of COG input.tif output.tif`\n\t\t);\n\t}\n\n\t// Cap to GPU texture limit\n\tconst maxTexDim = getMaxTextureSize(map);\n\tconst needsDownsample = imgW > maxTexDim || imgH > maxTexDim;\n\tlet readW = imgW;\n\tlet readH = imgH;\n\tif (needsDownsample) {\n\t\tconst scale = Math.min(maxTexDim / imgW, maxTexDim / imgH);\n\t\treadW = Math.max(1, Math.round(imgW * scale));\n\t\treadH = Math.max(1, Math.round(imgH * scale));\n\t}\n\n\t// Read band 0 via a single tile fetch (non-tiled → single strip)\n\t// For non-tiled images, fetch tile (0,0) which returns the entire image\n\tconst tile = await geotiff.fetchTile(0, 0, { signal });\n\tif (signal.aborted) throw new DOMException('Aborted', 'AbortError');\n\n\tconst arr = tile.array;\n\tconst bandData: ArrayLike<number> = arr.layout === 'band-separate' ? arr.bands[0] : arr.data;\n\tconst isSingleBand = bandCount === 1;\n\n\t// Compute min/max for linear stretch (with scale/offset applied)\n\tlet bMin = Infinity;\n\tlet bMax = -Infinity;\n\tconst len = Math.min(bandData.length, readW * readH);\n\tfor (let i = 0; i < len; i++) {\n\t\tconst raw = bandData[i];\n\t\tif (nodata !== null && raw === nodata) continue;\n\t\tif (!Number.isFinite(raw)) continue;\n\t\tconst v = raw;\n\t\tif (v < bMin) bMin = v;\n\t\tif (v > bMax) bMax = v;\n\t}\n\tif (!Number.isFinite(bMin)) {\n\t\tbMin = 0;\n\t\tbMax = 1;\n\t}\n\tconst bRange = bMax - bMin || 1;\n\n\t// Normalize to RGBA (terrain color ramp for single-band int/float)\n\tconst pixelCount = len;\n\tconst useTerrainRamp = isSingleBand && (sampleFormat === 2 || sampleFormat === 3);\n\tconst rgba = new Uint8ClampedArray(pixelCount * 4);\n\tfor (let i = 0; i < pixelCount; i++) {\n\t\tconst raw = bandData[i];\n\t\tconst isND = (nodata !== null && raw === nodata) || !Number.isFinite(raw);\n\t\tconst idx = i * 4;\n\t\tif (isND) {\n\t\t\trgba[idx] = 0;\n\t\t\trgba[idx + 1] = 0;\n\t\t\trgba[idx + 2] = 0;\n\t\t\trgba[idx + 3] = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst t = Math.max(0, Math.min(1, (raw - bMin) / bRange));\n\t\tif (useTerrainRamp) {\n\t\t\tconst [r, g, b] = terrainColor(t);\n\t\t\trgba[idx] = r;\n\t\t\trgba[idx + 1] = g;\n\t\t\trgba[idx + 2] = b;\n\t\t} else {\n\t\t\tconst gray = Math.round(t * 255);\n\t\t\trgba[idx] = gray;\n\t\t\trgba[idx + 1] = gray;\n\t\t\trgba[idx + 2] = gray;\n\t\t}\n\t\trgba[idx + 3] = 255;\n\t}\n\n\t// Render to canvas → data URL\n\tconst canvas = document.createElement('canvas');\n\tcanvas.width = readW;\n\tcanvas.height = readH;\n\tconst ctx = canvas.getContext('2d')!;\n\tctx.putImageData(new ImageData(rgba, readW, readH), 0, 0);\n\tconst dataUrl = canvas.toDataURL();\n\tcanvas.width = 0;\n\tcanvas.height = 0;\n\n\t// Add to MapLibre as native image source\n\tcleanupNativeBitmap(map);\n\tmap.addSource(BITMAP_SOURCE, {\n\t\ttype: 'image',\n\t\turl: dataUrl,\n\t\tcoordinates: [\n\t\t\t[geoBounds.west, geoBounds.north],\n\t\t\t[geoBounds.east, geoBounds.north],\n\t\t\t[geoBounds.east, geoBounds.south],\n\t\t\t[geoBounds.west, geoBounds.south]\n\t\t]\n\t});\n\tmap.addLayer({\n\t\tid: BITMAP_LAYER,\n\t\tsource: BITMAP_SOURCE,\n\t\ttype: 'raster',\n\t\tpaint: { 'raster-opacity': 1 }\n\t});\n\n\treturn {\n\t\twidth: imgW,\n\t\theight: imgH,\n\t\tbandCount,\n\t\tdataType,\n\t\tbounds: geoBounds,\n\t\tdownsampled: needsDownsample\n\t};\n}\n\n// ─── Custom pipeline for non-uint COGs ───────────────────────────\n\n/** Result type returned by our custom getTileData. */\nexport interface CustomTileData {\n\timageData: ImageData;\n\twidth: number;\n\theight: number;\n}\n\n/**\n * Check whether a GeoTIFF needs a custom render pipeline.\n * v0.3's inferRenderPipeline only supports unsigned integers (SampleFormat 1).\n * Signed int (2) and float (3) need custom getTileData/renderTile.\n */\nexport function needsCustomPipeline(geotiff: GeoTIFFType): boolean {\n\tconst tags = geotiff.cachedTags;\n\tconst sf = tags.sampleFormat;\n\t// sampleFormat is null or not uint → needs custom\n\treturn sf === null || sf[0] !== 1;\n}\n\n/**\n * Create custom getTileData for non-uint COGs.\n * Reads band 0, normalizes using GDAL statistics / per-tile adaptive stretch,\n * applies terrain color ramp for single-band data.\n */\nexport function createCustomGetTileData(geotiff: GeoTIFFType) {\n\t// Read Scale/Offset TIFF tags (GDAL convention for scaled datasets like DEMs)\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tconst tags = geotiff.cachedTags as Record<string, any>;\n\t// GDAL stores data-scaling Scale/Offset as TIFF tags (33550-area).\n\t// @developmentseed/geotiff exposes them in cachedTags but the TS type\n\t// doesn't declare them — access via any.\n\tconst gdalScale: number | null = tags.scale ?? null;\n\tconst gdalOffset: number | null = tags.offset ?? null;\n\tconst hasScaleOffset =\n\t\tgdalScale !== null && gdalOffset !== null && (gdalScale !== 1 || gdalOffset !== 0);\n\n\t// Pre-compute normalization range from stored GDAL statistics if available\n\tconst stats = geotiff.storedStats;\n\tlet globalMin: number | null = null;\n\tlet globalMax: number | null = null;\n\tif (stats) {\n\t\tconst band1Stats = stats.get(1); // GDAL uses 1-based indexing\n\t\tif (band1Stats) {\n\t\t\tglobalMin = band1Stats.min ?? null;\n\t\t\tglobalMax = band1Stats.max ?? null;\n\t\t}\n\t}\n\n\t// If we have global stats, apply scale/offset to get real-world units\n\tif (globalMin !== null && globalMax !== null && hasScaleOffset) {\n\t\tglobalMin = globalMin * (gdalScale ?? 1) + (gdalOffset ?? 0);\n\t\tglobalMax = globalMax * (gdalScale ?? 1) + (gdalOffset ?? 0);\n\t}\n\n\tconst bandCount = geotiff.count;\n\tconst sf = tags.sampleFormat?.[0] ?? 1;\n\tconst isSingleBand = bandCount === 1;\n\n\t// Shared range across all tiles — when no GDAL stats exist, the first\n\t// tile's scan seeds the range and subsequent tiles widen it. This\n\t// eliminates visible seams between tiles caused by per-tile normalization.\n\tlet sharedMin = globalMin;\n\tlet sharedMax = globalMax;\n\n\treturn async (\n\t\timage: GeoTIFFType | Overview,\n\t\toptions: { x: number; y: number; pool: unknown; signal?: AbortSignal }\n\t): Promise<CustomTileData> => {\n\t\tconst tile = await image.fetchTile(options.x, options.y, {\n\t\t\tboundless: false,\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tpool: options.pool as any,\n\t\t\tsignal: options.signal\n\t\t});\n\n\t\tconst arr = tile.array;\n\t\tconst { width, height, nodata } = arr;\n\t\tconst bandData: ArrayLike<number> = arr.layout === 'band-separate' ? arr.bands[0] : arr.data;\n\n\t\tconst pixelCount = width * height;\n\t\tconst scale = gdalScale ?? 1;\n\t\tconst offset = gdalOffset ?? 0;\n\n\t\t// When no global stats, scan this tile and widen the shared range\n\t\tif (sharedMin === null || sharedMax === null) {\n\t\t\tlet tMin = Infinity;\n\t\t\tlet tMax = -Infinity;\n\t\t\tfor (let i = 0; i < pixelCount; i++) {\n\t\t\t\tconst raw = bandData[i];\n\t\t\t\tif (nodata !== null && raw === nodata) continue;\n\t\t\t\tif (!Number.isFinite(raw)) continue;\n\t\t\t\tconst v = hasScaleOffset ? raw * scale + offset : raw;\n\t\t\t\tif (v < tMin) tMin = v;\n\t\t\t\tif (v > tMax) tMax = v;\n\t\t\t}\n\t\t\tif (Number.isFinite(tMin)) {\n\t\t\t\tsharedMin = tMin;\n\t\t\t\tsharedMax = tMax;\n\t\t\t} else {\n\t\t\t\tsharedMin = 0;\n\t\t\t\tsharedMax = 1;\n\t\t\t}\n\t\t}\n\t\tconst rangeMin = sharedMin!;\n\t\tconst rangeMax = sharedMax!;\n\t\tconst range = rangeMax - rangeMin || 1;\n\n\t\t// Render to RGBA\n\t\tconst rgba = new Uint8ClampedArray(pixelCount * 4);\n\t\tfor (let i = 0; i < pixelCount; i++) {\n\t\t\tconst raw = bandData[i];\n\t\t\tconst isND = (nodata !== null && raw === nodata) || !Number.isFinite(raw);\n\t\t\tconst idx = i * 4;\n\t\t\tif (isND) {\n\t\t\t\trgba[idx] = 0;\n\t\t\t\trgba[idx + 1] = 0;\n\t\t\t\trgba[idx + 2] = 0;\n\t\t\t\trgba[idx + 3] = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst v = hasScaleOffset ? raw * scale + offset : raw;\n\t\t\tconst t = Math.max(0, Math.min(1, (v - rangeMin) / range));\n\t\t\tif (isSingleBand && (sf === 2 || sf === 3)) {\n\t\t\t\t// Terrain color ramp for single-band int/float (likely elevation/DEM)\n\t\t\t\tconst [r, g, b] = terrainColor(t);\n\t\t\t\trgba[idx] = r;\n\t\t\t\trgba[idx + 1] = g;\n\t\t\t\trgba[idx + 2] = b;\n\t\t\t} else {\n\t\t\t\t// Grayscale for multi-band or other types\n\t\t\t\tconst gray = Math.round(t * 255);\n\t\t\t\trgba[idx] = gray;\n\t\t\t\trgba[idx + 1] = gray;\n\t\t\t\trgba[idx + 2] = gray;\n\t\t\t}\n\t\t\trgba[idx + 3] = 255;\n\t\t}\n\n\t\treturn {\n\t\t\timageData: new ImageData(rgba, width, height),\n\t\t\twidth,\n\t\t\theight\n\t\t};\n\t};\n}\n\n/**\n * Custom renderTile for non-uint COGs.\n * v0.5 RasterLayer requires a RenderTileResult with `image` or `renderPipeline`.\n * We produce an ImageData and pass it through the `image` slot. deck.gl manages\n * the texture lifecycle and prepends a CreateTexture module automatically.\n */\nexport function customRenderTile(data: CustomTileData): { image: ImageData } {\n\treturn { image: data.imageData };\n}\n\n// ─── Configurable custom pipeline ────────────────────────────────\n\n/**\n * Extract band data arrays from a raster tile.\n * Returns an array of typed arrays, one per band.\n */\nfunction extractBands(\n\tarr: {\n\t\tlayout: string;\n\t\tbands?: ArrayLike<number>[];\n\t\tdata?: ArrayLike<number>;\n\t\tcount: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tbandCount: number,\n\tpixelCount: number\n): ArrayLike<number>[] {\n\tif (arr.layout === 'band-separate' && arr.bands) {\n\t\treturn arr.bands as ArrayLike<number>[];\n\t}\n\t// pixel-interleaved → split into per-band arrays\n\tconst data = arr.data!;\n\tconst bands: ArrayLike<number>[] = [];\n\tfor (let b = 0; b < bandCount; b++) {\n\t\tconst band = new Float64Array(pixelCount);\n\t\tfor (let i = 0; i < pixelCount; i++) {\n\t\t\tband[i] = (data as ArrayLike<number>)[i * bandCount + b];\n\t\t}\n\t\tbands.push(band);\n\t}\n\treturn bands;\n}\n\n/**\n * Compute per-band min/max from an array of band data.\n * Returns [min[], max[]] for the requested band indices.\n */\nfunction computeBandRanges(\n\tbands: ArrayLike<number>[],\n\tbandIndices: number[],\n\tpixelCount: number,\n\tnodata: number | null\n): { mins: number[]; maxs: number[] } {\n\tconst mins: number[] = [];\n\tconst maxs: number[] = [];\n\tfor (const bi of bandIndices) {\n\t\tconst band = bands[bi];\n\t\tif (!band) {\n\t\t\tmins.push(0);\n\t\t\tmaxs.push(1);\n\t\t\tcontinue;\n\t\t}\n\t\tlet bMin = Infinity;\n\t\tlet bMax = -Infinity;\n\t\tfor (let i = 0; i < pixelCount; i++) {\n\t\t\tconst v = band[i];\n\t\t\tif (nodata !== null && v === nodata) continue;\n\t\t\tif (!Number.isFinite(v)) continue;\n\t\t\tif (v < bMin) bMin = v;\n\t\t\tif (v > bMax) bMax = v;\n\t\t}\n\t\tmins.push(Number.isFinite(bMin) ? bMin : 0);\n\t\tmaxs.push(Number.isFinite(bMax) ? bMax : 1);\n\t}\n\treturn { mins, maxs };\n}\n\n/**\n * Create a configurable getTileData that respects BandConfig.\n * Supports both RGB mode (multi-band → R,G,B) and single-band mode (color ramp).\n */\nexport function createConfigurableGetTileData(geotiff: GeoTIFFType, config: BandConfig) {\n\tconst bandCount = geotiff.count;\n\n\t// Shared per-band ranges across tiles (seeded on first tile, widened by subsequent)\n\tconst sharedMins = new Map<number, number>();\n\tconst sharedMaxs = new Map<number, number>();\n\n\treturn async (\n\t\timage: GeoTIFFType | Overview,\n\t\toptions: { x: number; y: number; pool: unknown; signal?: AbortSignal }\n\t): Promise<CustomTileData> => {\n\t\tconst tile = await image.fetchTile(options.x, options.y, {\n\t\t\tboundless: false,\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tpool: options.pool as any,\n\t\t\tsignal: options.signal\n\t\t});\n\n\t\tconst arr = tile.array;\n\t\tconst { width, height, nodata } = arr;\n\t\tconst pixelCount = width * height;\n\t\tconst bands = extractBands(arr, bandCount, pixelCount);\n\n\t\tconst rgba = new Uint8ClampedArray(pixelCount * 4);\n\n\t\tif (config.mode === 'rgb') {\n\t\t\t// RGB mode: map 3 bands to R, G, B\n\t\t\tconst indices = [config.rBand, config.gBand, config.bBand];\n\t\t\t// Compute ranges for the 3 selected bands\n\t\t\tfor (const bi of indices) {\n\t\t\t\tif (!sharedMins.has(bi)) {\n\t\t\t\t\tconst { mins, maxs } = computeBandRanges(bands, [bi], pixelCount, nodata);\n\t\t\t\t\tsharedMins.set(bi, mins[0]);\n\t\t\t\t\tsharedMaxs.set(bi, maxs[0]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst rBand = bands[config.rBand];\n\t\t\tconst gBand = bands[config.gBand];\n\t\t\tconst bBand = bands[config.bBand];\n\t\t\tconst rMin = sharedMins.get(config.rBand)!;\n\t\t\tconst rMax = sharedMaxs.get(config.rBand)!;\n\t\t\tconst gMin = sharedMins.get(config.gBand)!;\n\t\t\tconst gMax = sharedMaxs.get(config.gBand)!;\n\t\t\tconst bMin = sharedMins.get(config.bBand)!;\n\t\t\tconst bMax = sharedMaxs.get(config.bBand)!;\n\t\t\tconst rRange = rMax - rMin || 1;\n\t\t\tconst gRange = gMax - gMin || 1;\n\t\t\tconst bRange = bMax - bMin || 1;\n\n\t\t\tfor (let i = 0; i < pixelCount; i++) {\n\t\t\t\tconst rv = rBand?.[i] ?? 0;\n\t\t\t\tconst gv = gBand?.[i] ?? 0;\n\t\t\t\tconst bv = bBand?.[i] ?? 0;\n\t\t\t\tconst isND =\n\t\t\t\t\t(nodata !== null && (rv === nodata || gv === nodata || bv === nodata)) ||\n\t\t\t\t\t!Number.isFinite(rv);\n\t\t\t\tconst idx = i * 4;\n\t\t\t\tif (isND) {\n\t\t\t\t\trgba[idx] = 0;\n\t\t\t\t\trgba[idx + 1] = 0;\n\t\t\t\t\trgba[idx + 2] = 0;\n\t\t\t\t\trgba[idx + 3] = 0;\n\t\t\t\t} else {\n\t\t\t\t\trgba[idx] = Math.round(Math.max(0, Math.min(1, (rv - rMin) / rRange)) * 255);\n\t\t\t\t\trgba[idx + 1] = Math.round(Math.max(0, Math.min(1, (gv - gMin) / gRange)) * 255);\n\t\t\t\t\trgba[idx + 2] = Math.round(Math.max(0, Math.min(1, (bv - bMin) / bRange)) * 255);\n\t\t\t\t\trgba[idx + 3] = 255;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Single-band mode: normalize + color ramp\n\t\t\tconst bi = config.band;\n\t\t\tconst bandData = bands[bi];\n\t\t\tif (!sharedMins.has(bi) && bandData) {\n\t\t\t\tconst { mins, maxs } = computeBandRanges(bands, [bi], pixelCount, nodata);\n\t\t\t\tsharedMins.set(bi, mins[0]);\n\t\t\t\tsharedMaxs.set(bi, maxs[0]);\n\t\t\t}\n\t\t\tconst rangeMin = sharedMins.get(bi) ?? 0;\n\t\t\tconst rangeMax = sharedMaxs.get(bi) ?? 1;\n\t\t\tconst range = rangeMax - rangeMin || 1;\n\t\t\tconst rampStops = COLOR_RAMP_STOPS[config.colorRamp];\n\n\t\t\tfor (let i = 0; i < pixelCount; i++) {\n\t\t\t\tconst raw = bandData?.[i] ?? 0;\n\t\t\t\tconst isND = (nodata !== null && raw === nodata) || !Number.isFinite(raw);\n\t\t\t\tconst idx = i * 4;\n\t\t\t\tif (isND) {\n\t\t\t\t\trgba[idx] = 0;\n\t\t\t\t\trgba[idx + 1] = 0;\n\t\t\t\t\trgba[idx + 2] = 0;\n\t\t\t\t\trgba[idx + 3] = 0;\n\t\t\t\t} else {\n\t\t\t\t\tconst t = Math.max(0, Math.min(1, (raw - rangeMin) / range));\n\t\t\t\t\tconst [r, g, b] = interpolateRamp(rampStops, t);\n\t\t\t\t\trgba[idx] = r;\n\t\t\t\t\trgba[idx + 1] = g;\n\t\t\t\t\trgba[idx + 2] = b;\n\t\t\t\t\trgba[idx + 3] = 255;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { imageData: new ImageData(rgba, width, height), width, height };\n\t};\n}\n\n// ─── Pixel inspection ────────────────────────────────────────────\n\nexport interface PixelValue {\n\tlng: number;\n\tlat: number;\n\tvalues: number[];\n\trow: number;\n\tcol: number;\n}\n\n// ─── EPSG resolution via bundled database ────────────────────────\n\n/**\n * Look up the WKT string for an EPSG code from the bundled\n * `@developmentseed/epsg` database. The CSV is streamed, gunzipped and parsed\n * once on first use, subsequent lookups share the cached map via the\n * `loadEpsg()` internal singleton promise.\n */\nasync function lookupEpsgWkt(code: number): Promise<string | null> {\n\tconst db = await loadEpsg(epsgCsvUrl);\n\treturn db.get(code) ?? null;\n}\n\n// Units that `@developmentseed/proj` `metersPerUnit` accepts.\nconst ACCEPTED_CRS_UNITS = new Set([\n\t'm',\n\t'metre',\n\t'meter',\n\t'meters',\n\t'foot',\n\t'us survey foot',\n\t'degree'\n]);\n\n/**\n * Normalize a parsed projection definition so `generateTileMatrixSet` can\n * compute metersPerUnit. wkt-parser sets `units = wkt.UNIT.name.toLowerCase()`\n * and some EPSG WKT entries in the bundled database have a missing or\n * non-standard UNIT node, which surfaces as `units = \"unknown\"` and a downstream\n * throw. Infer the unit from `to_meter` or projection type when possible.\n */\nfunction normalizeCrsUnits(def: ProjectionDefinition): ProjectionDefinition {\n\tconst current = def.units?.toLowerCase();\n\tif (current && ACCEPTED_CRS_UNITS.has(current)) return def;\n\tif (def.projName === 'longlat') {\n\t\tdef.units = 'degree';\n\t\treturn def;\n\t}\n\tconst toMeter = def.to_meter;\n\tif (toMeter === undefined || Math.abs(toMeter - 1) < 1e-9) {\n\t\tdef.units = 'meter';\n\t} else if (Math.abs(toMeter - 0.3048) < 1e-9) {\n\t\tdef.units = 'foot';\n\t} else if (Math.abs(toMeter - 1200 / 3937) < 1e-9) {\n\t\tdef.units = 'us survey foot';\n\t}\n\treturn def;\n}\n\n/**\n * Create an async EPSG resolver for `@developmentseed/deck.gl-geotiff`.\n * Looks up the numeric EPSG code in the bundled WKT database and returns the\n * `ProjectionDefinition` produced by `parseWkt`. Throws a clear error when the\n * code is not present in the database.\n */\nexport function createEpsgResolver(): EpsgResolver {\n\tconst cache = new Map<number, ProjectionDefinition>();\n\treturn async (code: number): Promise<ProjectionDefinition> => {\n\t\tconst cached = cache.get(code);\n\t\tif (cached) return cached;\n\t\tconst wkt = await lookupEpsgWkt(code);\n\t\tif (!wkt) {\n\t\t\tthrow new Error(`EPSG:${code} not found in bundled projection database`);\n\t\t}\n\t\tconst def = normalizeCrsUnits(parseWkt(wkt));\n\t\tcache.set(code, def);\n\t\treturn def;\n\t};\n}\n\n/**\n * Resolve a proj4-compatible definition for a CRS read from a GeoTIFF.\n * For numeric EPSG codes this returns the WKT string from the bundled EPSG\n * database, which `proj4()` accepts directly. For ProjJSON it falls back to a\n * JSON string. Returns null for EPSG:4326 (no conversion needed) or when the\n * code is not present in the database.\n */\nexport async function resolveProj4Def(\n\tcrs: number | unknown,\n\t_signal: AbortSignal\n): Promise<string | null> {\n\tif (crs === 4326) return null;\n\tif (typeof crs === 'number') {\n\t\treturn lookupEpsgWkt(crs);\n\t}\n\t// ProjJSON — stringify for proj4\n\treturn JSON.stringify(crs);\n}\n\n/**\n * Read pixel values at a given lng/lat from a GeoTIFF.\n * Converts WGS84 → source CRS → pixel coords, fetches the tile, reads all bands.\n */\nexport async function readPixelAtLngLat(\n\tgeotiff: GeoTIFFType,\n\tlng: number,\n\tlat: number,\n\tproj4Def: string | null,\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpool: any,\n\tsignal?: AbortSignal\n): Promise<PixelValue | null> {\n\t// Convert WGS84 to source CRS\n\tlet srcX = lng;\n\tlet srcY = lat;\n\tif (proj4Def) {\n\t\ttry {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tconst conv = proj4Lib(proj4Def, 'EPSG:4326') as any;\n\t\t\t[srcX, srcY] = conv.inverse([lng, lat]);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t// Get pixel indices (row, col)\n\tconst [row, col] = geotiff.index(srcX, srcY);\n\tif (row < 0 || row >= geotiff.height || col < 0 || col >= geotiff.width) return null;\n\n\t// Compute tile indices\n\tconst tileX = Math.floor(col / geotiff.tileWidth);\n\tconst tileY = Math.floor(row / geotiff.tileHeight);\n\n\t// Fetch tile\n\tconst tile = await geotiff.fetchTile(tileX, tileY, { pool, signal });\n\tconst arr = tile.array;\n\n\t// Read all band values at this pixel\n\tconst localCol = col - tileX * arr.width;\n\tconst localRow = row - tileY * arr.height;\n\tconst pixelIndex = localRow * arr.width + localCol;\n\n\tconst values: number[] = [];\n\tif (arr.layout === 'band-separate') {\n\t\tfor (let b = 0; b < arr.count; b++) {\n\t\t\tvalues.push((arr as { bands: ArrayLike<number>[] }).bands[b][pixelIndex]);\n\t\t}\n\t} else {\n\t\tfor (let b = 0; b < arr.count; b++) {\n\t\t\tvalues.push((arr as { data: ArrayLike<number> }).data[pixelIndex * arr.count + b]);\n\t\t}\n\t}\n\n\treturn { lng, lat, values, row, col };\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","export 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 async function parseMarkdownDocument(markdown: string): Promise<ParsedMarkdownDocument> {\n\tlet frontmatter: Record<string, any> = {};\n\tlet content = markdown;\n\n\tconst fmMatch = markdown.match(/^---\\n([\\s\\S]*?)\\n---\\n/);\n\tif (fmMatch) {\n\t\ttry {\n\t\t\tconst { default: YAML } = await import('yaml');\n\t\t\tfrontmatter = YAML.parse(fmMatch[1]) || {};\n\t\t} catch {\n\t\t\t// Invalid YAML or yaml peer dep not installed, ignore frontmatter\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"]}
|