@sqlrooms/deck 0.29.0-rc.10 → 0.29.0-rc.11

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.
Files changed (118) hide show
  1. package/README.md +42 -6
  2. package/dist/DeckJsonMap.d.ts.map +1 -1
  3. package/dist/DeckJsonMap.js +2 -6
  4. package/dist/DeckJsonMap.js.map +1 -1
  5. package/dist/DeckJsonMapSpec.d.ts +875 -53
  6. package/dist/DeckJsonMapSpec.d.ts.map +1 -1
  7. package/dist/DeckJsonMapSpec.js +7 -0
  8. package/dist/DeckJsonMapSpec.js.map +1 -1
  9. package/dist/DeckMapDefaultStylesProvider.d.ts +3 -4
  10. package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
  11. package/dist/DeckMapDefaultStylesProvider.js +13 -7
  12. package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
  13. package/dist/MapSettings.d.ts.map +1 -1
  14. package/dist/MapSettings.js +25 -11
  15. package/dist/MapSettings.js.map +1 -1
  16. package/dist/ai.d.ts +19 -5
  17. package/dist/ai.d.ts.map +1 -1
  18. package/dist/ai.js +60 -112
  19. package/dist/ai.js.map +1 -1
  20. package/dist/aiNormalize.d.ts +31 -0
  21. package/dist/aiNormalize.d.ts.map +1 -0
  22. package/dist/aiNormalize.js +629 -0
  23. package/dist/aiNormalize.js.map +1 -0
  24. package/dist/dashboard.d.ts.map +1 -1
  25. package/dist/dashboard.js +72 -8
  26. package/dist/dashboard.js.map +1 -1
  27. package/dist/dashboardConfig.d.ts +10 -1
  28. package/dist/dashboardConfig.d.ts.map +1 -1
  29. package/dist/dashboardConfig.js +55 -22
  30. package/dist/dashboardConfig.js.map +1 -1
  31. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
  32. package/dist/datasets/PreparedDatasetStore.js +31 -2
  33. package/dist/datasets/PreparedDatasetStore.js.map +1 -1
  34. package/dist/datasets/wrapGeometryAsWkb.d.ts +20 -0
  35. package/dist/datasets/wrapGeometryAsWkb.d.ts.map +1 -0
  36. package/dist/datasets/wrapGeometryAsWkb.js +65 -0
  37. package/dist/datasets/wrapGeometryAsWkb.js.map +1 -0
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/json/compileGeoArrowAccessor.d.ts +5 -0
  43. package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -1
  44. package/dist/json/compileGeoArrowAccessor.js +17 -3
  45. package/dist/json/compileGeoArrowAccessor.js.map +1 -1
  46. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
  47. package/dist/json/createDeckJsonConfiguration.js +85 -18
  48. package/dist/json/createDeckJsonConfiguration.js.map +1 -1
  49. package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
  50. package/dist/json/extractColorScaleLegends.js +21 -7
  51. package/dist/json/extractColorScaleLegends.js.map +1 -1
  52. package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -1
  53. package/dist/json/layers/DeckH3HexagonLayer.js +9 -14
  54. package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -1
  55. package/dist/json/layers/h3IndexFormat.d.ts +6 -0
  56. package/dist/json/layers/h3IndexFormat.d.ts.map +1 -0
  57. package/dist/json/layers/h3IndexFormat.js +17 -0
  58. package/dist/json/layers/h3IndexFormat.js.map +1 -0
  59. package/dist/json/layers/index.d.ts +1 -0
  60. package/dist/json/layers/index.d.ts.map +1 -1
  61. package/dist/json/layers/index.js +1 -0
  62. package/dist/json/layers/index.js.map +1 -1
  63. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
  64. package/dist/json/rewriteGeoArrowAccessors.js +9 -0
  65. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
  66. package/dist/json/scaleFunction.d.ts +30 -0
  67. package/dist/json/scaleFunction.d.ts.map +1 -0
  68. package/dist/json/scaleFunction.js +126 -0
  69. package/dist/json/scaleFunction.js.map +1 -0
  70. package/dist/mapAiConfig.d.ts +2 -0
  71. package/dist/mapAiConfig.d.ts.map +1 -1
  72. package/dist/mapAiConfig.js +2 -1
  73. package/dist/mapAiConfig.js.map +1 -1
  74. package/dist/mapAiSharedInstructions.d.ts +3 -0
  75. package/dist/mapAiSharedInstructions.d.ts.map +1 -0
  76. package/dist/mapAiSharedInstructions.js +16 -0
  77. package/dist/mapAiSharedInstructions.js.map +1 -0
  78. package/dist/mapConfig.d.ts +6 -0
  79. package/dist/mapConfig.d.ts.map +1 -1
  80. package/dist/mapConfig.js.map +1 -1
  81. package/dist/mapConfigUtils.d.ts.map +1 -1
  82. package/dist/mapConfigUtils.js +2 -0
  83. package/dist/mapConfigUtils.js.map +1 -1
  84. package/dist/mapFit.d.ts +16 -0
  85. package/dist/mapFit.d.ts.map +1 -1
  86. package/dist/mapFit.js +208 -30
  87. package/dist/mapFit.js.map +1 -1
  88. package/dist/mapLayerConfigUtils.d.ts +9 -1
  89. package/dist/mapLayerConfigUtils.d.ts.map +1 -1
  90. package/dist/mapLayerConfigUtils.js +62 -12
  91. package/dist/mapLayerConfigUtils.js.map +1 -1
  92. package/dist/mapResourceAuthoring.d.ts +2 -0
  93. package/dist/mapResourceAuthoring.d.ts.map +1 -1
  94. package/dist/mapResourceAuthoring.js +402 -16
  95. package/dist/mapResourceAuthoring.js.map +1 -1
  96. package/dist/mosaic.d.ts +1 -1
  97. package/dist/mosaic.d.ts.map +1 -1
  98. package/dist/mosaic.js.map +1 -1
  99. package/dist/prepare/geoarrow.js.map +1 -1
  100. package/dist/prepare/wkbDecoder.d.ts +10 -0
  101. package/dist/prepare/wkbDecoder.d.ts.map +1 -1
  102. package/dist/prepare/wkbDecoder.js +93 -18
  103. package/dist/prepare/wkbDecoder.js.map +1 -1
  104. package/dist/prepare/wkbParser.d.ts +7 -0
  105. package/dist/prepare/wkbParser.d.ts.map +1 -1
  106. package/dist/prepare/wkbParser.js +21 -0
  107. package/dist/prepare/wkbParser.js.map +1 -1
  108. package/dist/selectStarAsWkbCollision.d.ts +3 -0
  109. package/dist/selectStarAsWkbCollision.d.ts.map +1 -0
  110. package/dist/selectStarAsWkbCollision.js +78 -0
  111. package/dist/selectStarAsWkbCollision.js.map +1 -0
  112. package/dist/types.d.ts +1 -1
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/types.js.map +1 -1
  115. package/dist/useDeckMapFitToBounds.d.ts.map +1 -1
  116. package/dist/useDeckMapFitToBounds.js +1 -1
  117. package/dist/useDeckMapFitToBounds.js.map +1 -1
  118. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"mapResourceAuthoring.js","sourceRoot":"","sources":["../src/mapResourceAuthoring.ts"],"names":[],"mappings":"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","sourcesContent":["import {DeckJsonMapSpec} from './DeckJsonMapSpec';\nimport type {DeckMapConfig} from './mapConfig';\nimport {\n isDeckMapSqlDatasetSource,\n isDeckMapTableDatasetSource,\n} from './mapConfig';\n\nexport type DeckMapResourceConfigIssue = {\n path: string;\n message: string;\n};\n\nexport type DeckMapResourceConfigValidationOptions = {\n /** Empty resources are valid while waiting for a user-selected table. */\n allowEmpty?: boolean;\n};\n\n/** Controls how an incoming map config patch is merged with durable state. */\nexport type DeckMapResourceConfigMergeOptions = {\n /** Treat an incoming `spec.layers` array as the complete replacement list. */\n replaceLayers?: boolean;\n /** Treat incoming `datasets` as the complete replacement registry. */\n replaceDatasets?: boolean;\n};\n\n/** Error raised before an invalid map resource can be durably written. */\nexport class DeckMapResourceConfigError extends Error {\n readonly issues: DeckMapResourceConfigIssue[];\n\n constructor(issues: DeckMapResourceConfigIssue[]) {\n super(\n `Invalid Deck map resource config: ${issues\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ')}`,\n );\n this.name = 'DeckMapResourceConfigError';\n this.issues = issues;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction hasEntries(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && Object.keys(value).length > 0;\n}\n\nfunction mergeOptionalRecord(\n existing: unknown,\n incoming: unknown,\n): Record<string, unknown> | undefined {\n if (isRecord(existing) && isRecord(incoming)) {\n return {...existing, ...incoming};\n }\n if (isRecord(incoming)) return incoming;\n return isRecord(existing) ? existing : undefined;\n}\n\nfunction mergeLayerPatch(existingLayer: unknown, incomingLayer: unknown) {\n if (!isRecord(existingLayer) || !isRecord(incomingLayer)) {\n return incomingLayer;\n }\n return {\n ...existingLayer,\n ...incomingLayer,\n _sqlroomsBinding: mergeOptionalRecord(\n existingLayer._sqlroomsBinding,\n incomingLayer._sqlroomsBinding,\n ),\n };\n}\n\nfunction mergeLayerPatches(\n existingLayers: unknown[] | undefined,\n incomingLayers: unknown[] | undefined,\n) {\n if (!incomingLayers || incomingLayers.length === 0) return existingLayers;\n if (!existingLayers || existingLayers.length === 0) return incomingLayers;\n\n const nextLayers = [...existingLayers];\n for (const [incomingIndex, incomingLayer] of incomingLayers.entries()) {\n const incomingId = isRecord(incomingLayer)\n ? (incomingLayer.id as string | undefined)\n : undefined;\n const existingIndex = incomingId\n ? existingLayers.findIndex(\n (layer) => isRecord(layer) && layer.id === incomingId,\n )\n : incomingIndex < existingLayers.length\n ? incomingIndex\n : -1;\n if (existingIndex >= 0) {\n nextLayers[existingIndex] = mergeLayerPatch(\n existingLayers[existingIndex],\n incomingLayer,\n );\n } else {\n nextLayers.push(incomingLayer);\n }\n }\n return nextLayers;\n}\n\nfunction mergeSpecPatch(\n existingSpec: unknown,\n incomingSpec: unknown,\n options: DeckMapResourceConfigMergeOptions,\n) {\n if (typeof incomingSpec === 'string') return incomingSpec;\n const existing = isRecord(existingSpec) ? existingSpec : undefined;\n const incoming = isRecord(incomingSpec) ? incomingSpec : undefined;\n if (!existing && !incoming) return incomingSpec ?? existingSpec;\n\n const existingLayers = Array.isArray(existing?.layers)\n ? existing.layers\n : undefined;\n const incomingLayers = Array.isArray(incoming?.layers)\n ? incoming.layers\n : undefined;\n const layers =\n options.replaceLayers && incomingLayers !== undefined\n ? incomingLayers\n : mergeLayerPatches(existingLayers, incomingLayers);\n return {\n ...(existing ?? {}),\n ...(incoming ?? {}),\n ...(layers ? {layers} : {}),\n };\n}\n\nfunction mergeDatasetRegistry(\n existingDatasets: DeckMapConfig['datasets'],\n incomingDatasets: DeckMapConfig['datasets'],\n replaceDatasets: boolean,\n): DeckMapConfig['datasets'] {\n if (replaceDatasets) return incomingDatasets;\n if (!hasEntries(incomingDatasets)) return existingDatasets;\n const datasets = {...existingDatasets};\n for (const [datasetId, incomingDataset] of Object.entries(incomingDatasets)) {\n const existingDataset = existingDatasets[datasetId];\n datasets[datasetId] = existingDataset\n ? {\n ...existingDataset,\n ...incomingDataset,\n source: incomingDataset.source ?? existingDataset.source,\n }\n : incomingDataset;\n }\n return datasets;\n}\n\n/**\n * Merges a sparse map-tool patch with durable state. Empty dataset registries\n * and layer arrays mean \"preserve\" only when an existing resource is present.\n */\nexport function mergeDeckMapResourceConfigPatch(\n existingConfig: DeckMapConfig | undefined,\n incomingConfig: DeckMapConfig,\n options: DeckMapResourceConfigMergeOptions = {},\n): DeckMapConfig {\n if (!existingConfig) return incomingConfig;\n return {\n ...existingConfig,\n ...incomingConfig,\n spec: mergeSpecPatch(existingConfig.spec, incomingConfig.spec, options),\n datasets: mergeDatasetRegistry(\n existingConfig.datasets,\n incomingConfig.datasets,\n options.replaceDatasets === true,\n ),\n mapProps: mergeOptionalRecord(\n existingConfig.mapProps,\n incomingConfig.mapProps,\n ),\n dataPolicy: mergeOptionalRecord(\n existingConfig.dataPolicy,\n incomingConfig.dataPolicy,\n ),\n } as DeckMapConfig;\n}\n\nfunction parseSpec(config: DeckMapConfig): {\n layers: Record<string, unknown>[];\n issues: DeckMapResourceConfigIssue[];\n} {\n let spec: unknown = config.spec;\n if (typeof spec === 'string') {\n try {\n spec = JSON.parse(spec);\n } catch {\n return {\n layers: [],\n issues: [{path: 'spec', message: 'must be valid JSON'}],\n };\n }\n }\n\n const parsed = DeckJsonMapSpec.safeParse(spec);\n if (!parsed.success) {\n return {\n layers: [],\n issues: parsed.error.issues.map((issue) => ({\n path: ['spec', ...issue.path].join('.'),\n message: issue.message,\n })),\n };\n }\n\n return {\n layers: (parsed.data.layers ?? []) as Record<string, unknown>[],\n issues: [],\n };\n}\n\n/**\n * Validates the post-merge invariants of a renderable, resource-native map.\n * Patch inputs may be sparse, but the durable result must have supported\n * dataset sources and dataset-backed layers.\n */\nexport function getDeckMapResourceConfigIssues(\n config: DeckMapConfig,\n options: DeckMapResourceConfigValidationOptions = {},\n): DeckMapResourceConfigIssue[] {\n const issues: DeckMapResourceConfigIssue[] = [];\n const datasetEntries = Object.entries(config.datasets);\n const datasetIds = datasetEntries.map(([datasetId]) => datasetId);\n const datasetIdSet = new Set(datasetIds);\n const parsedSpec = parseSpec(config);\n issues.push(...parsedSpec.issues);\n\n const isEmpty = datasetEntries.length === 0 && parsedSpec.layers.length === 0;\n if (isEmpty) {\n return options.allowEmpty\n ? issues\n : [\n ...issues,\n {\n path: 'datasets',\n message: 'must contain at least one dataset for a map write',\n },\n {\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n },\n ];\n }\n\n if (datasetEntries.length === 0) {\n issues.push({\n path: 'datasets',\n message: 'must contain at least one dataset',\n });\n }\n\n for (const [datasetId, dataset] of datasetEntries) {\n const source = dataset.source;\n const hasSqlSource =\n isDeckMapSqlDatasetSource(source) && source.sqlQuery.trim().length > 0;\n const hasTableSource =\n isDeckMapTableDatasetSource(source) && source.tableName.trim().length > 0;\n if (!hasSqlSource && !hasTableSource) {\n const legacySql = (dataset as unknown as Record<string, unknown>).sql;\n issues.push({\n path: `datasets.${datasetId}.source`,\n message:\n typeof legacySql === 'string'\n ? 'must define source.tableName or source.sqlQuery; top-level sql is not supported'\n : 'must define source.tableName or source.sqlQuery',\n });\n }\n }\n\n if (parsedSpec.layers.length === 0) {\n issues.push({\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n });\n }\n\n parsedSpec.layers.forEach((layer, index) => {\n const layerType = layer['@@type'];\n if (typeof layerType !== 'string' || layerType.trim().length === 0) {\n issues.push({\n path: `spec.layers.${index}.@@type`,\n message: 'must name a Deck JSON layer class',\n });\n }\n\n const binding =\n layer._sqlroomsBinding && typeof layer._sqlroomsBinding === 'object'\n ? (layer._sqlroomsBinding as Record<string, unknown>)\n : undefined;\n const boundDataset =\n typeof binding?.dataset === 'string' && binding.dataset.trim()\n ? binding.dataset\n : undefined;\n\n if (boundDataset) {\n if (!datasetIdSet.has(boundDataset)) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message: `references unknown dataset \"${boundDataset}\"`,\n });\n }\n return;\n }\n\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message:\n 'must bind the layer to a config.datasets entry; layer data references and implicit bindings are not durable resource bindings',\n });\n });\n\n const fitDataset = config.fitToData?.dataset;\n if (fitDataset && !datasetIdSet.has(fitDataset)) {\n issues.push({\n path: 'fitToData.dataset',\n message: `references unknown dataset \"${fitDataset}\"`,\n });\n }\n\n return issues;\n}\n\n/** Rejects invalid durable map writes after sparse patches have been merged. */\nexport function assertDeckMapResourceConfig(config: DeckMapConfig): void {\n const issues = getDeckMapResourceConfigIssues(config);\n if (issues.length > 0) throw new DeckMapResourceConfigError(issues);\n}\n\n/**\n * Returns the package-owned authoring contract for hosts with direct worksheet\n * map capability. Host adapters opt into it; they do not maintain prompt copies.\n */\nexport function getDeckMapResourceAiInstructions(): string {\n return `## Direct worksheet Deck map resources\n\nWhen authoring a worksheet map config, use the resource-native Deck JSON contract:\n- A new map must contain at least one config.datasets entry and at least one spec.layers entry.\n- Every dataset must define source.tableName, source.tableName plus source.transformSql, or source.sqlQuery. Never put sql directly on the dataset object.\n- Bind every layer to a dataset with _sqlroomsBinding.dataset. Never use data: \"@@#datasetId\" or an implicit single-dataset binding as a durable resource binding.\n- Use supported Deck JSON layer classes such as GeoArrowScatterplotLayer, GeoArrowHeatmapLayer, GeoArrowPolygonLayer, GeoArrowPathLayer, GeoArrowTripsLayer, GeoArrowArcLayer, GeoArrowColumnLayer, GeoArrowH3HexagonLayer, or GeoJsonLayer.\n- For table-backed datasets, also pass the same table through the tool's top-level tableName field. A selected table does not replace the required dataset source.\n- transformSql must be a single SELECT and must read from __sqlrooms_source. Use source.sqlQuery only for a standalone pinned query.\n- Use configMode \"basic\" for a straightforward single-layer map. Use \"custom\" only for advanced properties the basic settings cannot represent; custom mode does not relax dataset-source or layer-binding requirements.\n- For a point geometry column, prefer GeoArrowScatterplotLayer with dataset.geometryColumn and _sqlroomsBinding.geometryColumn set to the exact geometry column. For longitude/latitude columns, use source.transformSql to produce WKB geometry and bind that output column.\n- For updates, sparse config patches are allowed because they are merged with the existing resource. For creates, never send empty datasets or layers.\n- To remove existing layers or datasets, set replaceLayers and/or replaceDatasets to true and send the complete desired list or registry. Omit them for additive sparse updates.\n- If a map write reports an invalid resource config, repair the reported paths and retry the same direct map operation; do not replace it with a dashboard-backed map.\n\nMinimal table-backed point map shape:\n{\"configMode\":\"basic\",\"datasets\":{\"places\":{\"source\":{\"tableName\":\"places\"},\"geometryColumn\":\"geom\",\"geometryEncodingHint\":\"wkb\"}},\"spec\":{\"layers\":[{\"@@type\":\"GeoArrowScatterplotLayer\",\"id\":\"places\",\"_sqlroomsBinding\":{\"dataset\":\"places\",\"geometryColumn\":\"geom\"},\"getRadius\":4,\"radiusUnits\":\"pixels\",\"pickable\":true}]},\"fitToData\":{\"dataset\":\"places\",\"geometryColumn\":\"geom\"}}`;\n}\n"]}
1
+ {"version":3,"file":"mapResourceAuthoring.js","sourceRoot":"","sources":["../src/mapResourceAuthoring.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n binnedNumericSchemes,\n categoricalSchemes,\n continuousDivergingSchemes,\n continuousSequentialSchemes,\n formatColorSchemePromptLists,\n} from '@sqlrooms/color-scales/colorSchemeNames';\nimport {DeckJsonMapSpec} from './DeckJsonMapSpec';\nimport type {DeckMapConfig, DeckMapDatasetSource} from './mapConfig';\nimport {\n isDeckMapSqlDatasetSource,\n isDeckMapTableDatasetSource,\n} from './mapConfig';\nimport {hasSelectStarAsWkbCollision} from './selectStarAsWkbCollision';\nimport {getDeckMapSharedAiContractRules} from './mapAiSharedInstructions';\n\nexport type DeckMapResourceConfigIssue = {\n path: string;\n message: string;\n};\n\nexport type DeckMapResourceConfigValidationOptions = {\n /** Empty resources are valid while waiting for a user-selected table. */\n allowEmpty?: boolean;\n};\n\n/** Controls how an incoming map config patch is merged with durable state. */\nexport type DeckMapResourceConfigMergeOptions = {\n /** Treat an incoming `spec.layers` array as the complete replacement list. */\n replaceLayers?: boolean;\n /** Treat incoming `datasets` as the complete replacement registry. */\n replaceDatasets?: boolean;\n};\n\n/** Error raised before an invalid map resource can be durably written. */\nexport class DeckMapResourceConfigError extends Error {\n readonly issues: DeckMapResourceConfigIssue[];\n\n constructor(issues: DeckMapResourceConfigIssue[]) {\n super(\n `Invalid Deck map resource config: ${issues\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ')}`,\n );\n this.name = 'DeckMapResourceConfigError';\n this.issues = issues;\n }\n}\n\nconst BINNED_SCHEME_NAMES = new Set<string>(binnedNumericSchemes);\nconst SEQUENTIAL_SCHEME_NAMES = new Set<string>(continuousSequentialSchemes);\nconst DIVERGING_SCHEME_NAMES = new Set<string>(continuousDivergingSchemes);\nconst CATEGORICAL_SCHEME_NAMES = new Set<string>(categoricalSchemes);\n\n/** Issue when colorScale `type` and `scheme` disagree or are incomplete. */\nexport function getColorScaleTypeSchemeIssue(\n type: unknown,\n scheme: unknown,\n): string | undefined {\n if (typeof type !== 'string' || !type.trim()) {\n return 'colorScale requires a \"type\" (sequential, diverging, quantize, quantile, threshold, or categorical)';\n }\n if (typeof scheme !== 'string' || !scheme.trim()) {\n return 'colorScale requires a \"scheme\" (exact name such as Viridis, YlOrRd, Blues, or Tableau10)';\n }\n if (type !== type.trim()) {\n return 'colorScale type must not have leading or trailing whitespace';\n }\n if (scheme !== scheme.trim()) {\n return 'colorScale scheme must not have leading or trailing whitespace';\n }\n\n const scaleType = type;\n const schemeName = scheme;\n\n const allowedForType = (allowed: Set<string>, label: string) => {\n if (allowed.has(schemeName)) return undefined;\n if (SEQUENTIAL_SCHEME_NAMES.has(schemeName)) {\n return `scheme \"${schemeName}\" requires type \"sequential\" (not \"${scaleType}\") — use type \"sequential\", or pick a ${label}`;\n }\n if (DIVERGING_SCHEME_NAMES.has(schemeName)) {\n return `scheme \"${schemeName}\" requires type \"diverging\" (not \"${scaleType}\") — use type \"diverging\", or pick a ${label}`;\n }\n if (CATEGORICAL_SCHEME_NAMES.has(schemeName)) {\n return `scheme \"${schemeName}\" requires type \"categorical\" (not \"${scaleType}\") — use type \"categorical\", or pick a ${label}`;\n }\n return `scheme \"${schemeName}\" is not valid for type \"${scaleType}\" — use a ${label}`;\n };\n\n switch (scaleType) {\n case 'quantile':\n case 'quantize':\n case 'threshold':\n return allowedForType(\n BINNED_SCHEME_NAMES,\n 'ColorBrewer binned ramp such as YlOrRd, Blues, Greens, or RdYlBu',\n );\n case 'sequential':\n return allowedForType(\n SEQUENTIAL_SCHEME_NAMES,\n 'sequential scheme such as Viridis, Plasma, Blues, or YlOrRd',\n );\n case 'diverging':\n return allowedForType(\n DIVERGING_SCHEME_NAMES,\n 'diverging scheme such as RdBu, Spectral, or BrBG',\n );\n case 'categorical':\n return allowedForType(\n CATEGORICAL_SCHEME_NAMES,\n 'categorical scheme such as Tableau10, Set2, or Category10',\n );\n default:\n return `colorScale type \"${scaleType}\" is not supported — use sequential, diverging, quantize, quantile, threshold, or categorical`;\n }\n}\n\nfunction getColorScaleThresholdsIssue(\n type: unknown,\n thresholds: unknown,\n): string | undefined {\n if (type !== 'threshold') return undefined;\n if (\n !Array.isArray(thresholds) ||\n thresholds.length === 0 ||\n !thresholds.every(\n (value) => typeof value === 'number' && Number.isFinite(value),\n )\n ) {\n return 'colorScale type \"threshold\" requires a non-empty numeric \"thresholds\" array';\n }\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction hasEntries(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && Object.keys(value).length > 0;\n}\n\n/** True for invalid `ST_MakeLine(ST_Point(...) ORDER BY ...)` (ORDER BY belongs in LIST). */\nfunction hasBadStMakeLinePointOrderBy(sql: string): boolean {\n const re = /\\bST_MakeLine\\s*\\(/gi;\n let match: RegExpExecArray | null;\n while ((match = re.exec(sql)) !== null) {\n let i = match.index + match[0].length;\n while (i < sql.length && /\\s/.test(sql[i]!)) i += 1;\n if (/^LIST\\s*\\(/i.test(sql.slice(i))) continue;\n const pointMatch = sql.slice(i).match(/^ST_Point\\s*\\(/i);\n if (!pointMatch) continue;\n i += pointMatch[0].length;\n let depth = 1;\n while (i < sql.length && depth > 0) {\n const ch = sql[i];\n if (ch === '(') depth += 1;\n else if (ch === ')') depth -= 1;\n i += 1;\n }\n if (depth !== 0) continue;\n if (/^\\s+ORDER\\s+BY\\b/i.test(sql.slice(i))) {\n return true;\n }\n }\n return false;\n}\n\nfunction mergeOptionalRecord(\n existing: unknown,\n incoming: unknown,\n): Record<string, unknown> | undefined {\n if (isRecord(existing) && isRecord(incoming)) {\n return {...existing, ...incoming};\n }\n if (isRecord(incoming)) return incoming;\n return isRecord(existing) ? existing : undefined;\n}\n\nfunction mergeLayerPatch(existingLayer: unknown, incomingLayer: unknown) {\n if (!isRecord(existingLayer) || !isRecord(incomingLayer)) {\n return incomingLayer;\n }\n return {\n ...existingLayer,\n ...incomingLayer,\n _sqlroomsBinding: mergeOptionalRecord(\n existingLayer._sqlroomsBinding,\n incomingLayer._sqlroomsBinding,\n ),\n };\n}\n\nfunction mergeLayerPatches(\n existingLayers: unknown[] | undefined,\n incomingLayers: unknown[] | undefined,\n) {\n if (!incomingLayers || incomingLayers.length === 0) return existingLayers;\n if (!existingLayers || existingLayers.length === 0) return incomingLayers;\n\n const nextLayers = [...existingLayers];\n for (const [incomingIndex, incomingLayer] of incomingLayers.entries()) {\n const incomingId = isRecord(incomingLayer)\n ? (incomingLayer.id as string | undefined)\n : undefined;\n const existingIndex = incomingId\n ? existingLayers.findIndex(\n (layer) => isRecord(layer) && layer.id === incomingId,\n )\n : incomingIndex < existingLayers.length\n ? incomingIndex\n : -1;\n if (existingIndex >= 0) {\n nextLayers[existingIndex] = mergeLayerPatch(\n existingLayers[existingIndex],\n incomingLayer,\n );\n } else {\n nextLayers.push(incomingLayer);\n }\n }\n return nextLayers;\n}\n\nfunction mergeSpecPatch(\n existingSpec: unknown,\n incomingSpec: unknown,\n options: DeckMapResourceConfigMergeOptions,\n) {\n if (typeof incomingSpec === 'string') return incomingSpec;\n const existing = isRecord(existingSpec) ? existingSpec : undefined;\n const incoming = isRecord(incomingSpec) ? incomingSpec : undefined;\n if (!existing && !incoming) return incomingSpec ?? existingSpec;\n\n const existingLayers = Array.isArray(existing?.layers)\n ? existing.layers\n : undefined;\n const incomingLayers = Array.isArray(incoming?.layers)\n ? incoming.layers\n : undefined;\n const layers =\n options.replaceLayers && incomingLayers !== undefined\n ? incomingLayers\n : mergeLayerPatches(existingLayers, incomingLayers);\n return {\n ...(existing ?? {}),\n ...(incoming ?? {}),\n ...(layers ? {layers} : {}),\n };\n}\n\n/** True when a bare `{tableName}` patch would wipe existing geometry SQL. */\nfunction isSourceDowngrade(\n existingSource: DeckMapDatasetSource | undefined,\n incomingSource: DeckMapDatasetSource | undefined,\n): boolean {\n if (!existingSource || !incomingSource) return false;\n\n const incomingIsBareTableName =\n isDeckMapTableDatasetSource(incomingSource) &&\n !(\n 'transformSql' in incomingSource &&\n typeof incomingSource.transformSql === 'string' &&\n incomingSource.transformSql.trim().length > 0\n );\n if (!incomingIsBareTableName) return false;\n\n if (isDeckMapSqlDatasetSource(existingSource)) return true;\n\n return (\n isDeckMapTableDatasetSource(existingSource) &&\n typeof existingSource.transformSql === 'string' &&\n existingSource.transformSql.trim().length > 0\n );\n}\n\nfunction mergeDatasetRegistry(\n existingDatasets: DeckMapConfig['datasets'],\n incomingDatasets: DeckMapConfig['datasets'],\n replaceDatasets: boolean,\n): DeckMapConfig['datasets'] {\n if (replaceDatasets) return incomingDatasets;\n if (!hasEntries(incomingDatasets)) return existingDatasets;\n const datasets = {...existingDatasets};\n for (const [datasetId, incomingDataset] of Object.entries(incomingDatasets)) {\n const existingDataset = existingDatasets[datasetId];\n if (!existingDataset) {\n datasets[datasetId] = incomingDataset;\n continue;\n }\n const resolvedSource = isSourceDowngrade(\n existingDataset.source,\n incomingDataset.source,\n )\n ? existingDataset.source\n : (incomingDataset.source ?? existingDataset.source);\n datasets[datasetId] = {\n ...existingDataset,\n ...incomingDataset,\n source: resolvedSource,\n };\n }\n return datasets;\n}\n\n/**\n * Merges a sparse map-tool patch with durable state. Empty dataset registries\n * and layer arrays mean \"preserve\" only when an existing resource is present.\n */\nexport function mergeDeckMapResourceConfigPatch(\n existingConfig: DeckMapConfig | undefined,\n incomingConfig: DeckMapConfig,\n options: DeckMapResourceConfigMergeOptions = {},\n): DeckMapConfig {\n if (!existingConfig) return incomingConfig;\n return {\n ...existingConfig,\n ...incomingConfig,\n spec: mergeSpecPatch(existingConfig.spec, incomingConfig.spec, options),\n datasets: mergeDatasetRegistry(\n existingConfig.datasets,\n incomingConfig.datasets,\n options.replaceDatasets === true,\n ),\n mapProps: mergeOptionalRecord(\n existingConfig.mapProps,\n incomingConfig.mapProps,\n ),\n dataPolicy: mergeOptionalRecord(\n existingConfig.dataPolicy,\n incomingConfig.dataPolicy,\n ),\n } as DeckMapConfig;\n}\n\nfunction parseSpec(config: DeckMapConfig): {\n layers: Record<string, unknown>[];\n issues: DeckMapResourceConfigIssue[];\n} {\n let spec: unknown = config.spec;\n if (typeof spec === 'string') {\n try {\n spec = JSON.parse(spec);\n } catch {\n return {\n layers: [],\n issues: [{path: 'spec', message: 'must be valid JSON'}],\n };\n }\n }\n\n const parsed = DeckJsonMapSpec.safeParse(spec);\n if (!parsed.success) {\n return {\n layers: [],\n issues: parsed.error.issues.map((issue) => ({\n path: ['spec', ...issue.path].join('.'),\n message: issue.message,\n })),\n };\n }\n\n return {\n layers: (parsed.data.layers ?? []) as Record<string, unknown>[],\n issues: [],\n };\n}\n\nconst DECK_MAP_LAYER_CLASS_ALIASES: Record<string, string> = {\n ScatterplotLayer: 'GeoArrowScatterplotLayer',\n HeatmapLayer: 'GeoArrowHeatmapLayer',\n ColumnLayer: 'GeoArrowColumnLayer',\n PathLayer: 'GeoArrowPathLayer',\n PolygonLayer: 'GeoArrowPolygonLayer',\n SolidPolygonLayer: 'GeoArrowSolidPolygonLayer',\n ArcLayer: 'GeoArrowArcLayer',\n TripsLayer: 'GeoArrowTripsLayer',\n H3HexagonLayer: 'GeoArrowH3HexagonLayer',\n};\n\nconst COLOR_SCALE_ACCESSOR_PROPS = [\n 'getFillColor',\n 'getLineColor',\n 'getColor',\n 'getSourceColor',\n 'getTargetColor',\n] as const;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\n/**\n * Validates the post-merge invariants of a renderable, resource-native map.\n * Patch inputs may be sparse, but the durable result must have supported\n * dataset sources and dataset-backed layers.\n */\nexport function getDeckMapResourceConfigIssues(\n config: DeckMapConfig,\n options: DeckMapResourceConfigValidationOptions = {},\n): DeckMapResourceConfigIssue[] {\n const issues: DeckMapResourceConfigIssue[] = [];\n const datasetEntries = Object.entries(config.datasets);\n const datasetIds = datasetEntries.map(([datasetId]) => datasetId);\n const datasetIdSet = new Set(datasetIds);\n const parsedSpec = parseSpec(config);\n issues.push(...parsedSpec.issues);\n\n const isEmpty = datasetEntries.length === 0 && parsedSpec.layers.length === 0;\n if (isEmpty) {\n return options.allowEmpty\n ? issues\n : [\n ...issues,\n {\n path: 'datasets',\n message: 'must contain at least one dataset for a map write',\n },\n {\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n },\n ];\n }\n\n if (datasetEntries.length === 0) {\n issues.push({\n path: 'datasets',\n message: 'must contain at least one dataset',\n });\n }\n\n for (const [datasetId, dataset] of datasetEntries) {\n const source = dataset.source;\n const hasSqlSource =\n isDeckMapSqlDatasetSource(source) && source.sqlQuery.trim().length > 0;\n const hasTableSource =\n isDeckMapTableDatasetSource(source) && source.tableName.trim().length > 0;\n if (!hasSqlSource && !hasTableSource) {\n const legacySql = (dataset as unknown as Record<string, unknown>).sql;\n issues.push({\n path: `datasets.${datasetId}.source`,\n message:\n typeof legacySql === 'string'\n ? 'must define source.tableName or source.sqlQuery; top-level sql is not supported'\n : 'must define source.tableName or source.sqlQuery',\n });\n }\n\n const sqlParts = [\n isDeckMapTableDatasetSource(source) ? source.transformSql : undefined,\n isDeckMapSqlDatasetSource(source) ? source.sqlQuery : undefined,\n ].filter(\n (part): part is string =>\n typeof part === 'string' && part.trim().length > 0,\n );\n const sql = sqlParts.join('\\n');\n if (sql && hasSelectStarAsWkbCollision(sql)) {\n issues.push({\n path: `datasets.${datasetId}.source`,\n message:\n 'Do not use SELECT *, ST_AsWKB(col) AS col — DuckDB keeps the original column and the WKB alias collides, producing empty maps. Use SELECT * EXCLUDE (col), ST_AsWKB(col) AS col, or omit transformSql when the geometry column already exists.',\n });\n }\n }\n\n if (parsedSpec.layers.length === 0) {\n issues.push({\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n });\n }\n\n parsedSpec.layers.forEach((layer, index) => {\n const layerType = layer['@@type'];\n if (typeof layerType !== 'string' || layerType.trim().length === 0) {\n issues.push({\n path: `spec.layers.${index}.@@type`,\n message: 'must name a Deck JSON layer class',\n });\n } else {\n const aliased = DECK_MAP_LAYER_CLASS_ALIASES[layerType];\n if (aliased) {\n issues.push({\n path: `spec.layers.${index}.@@type`,\n message: `use \"${aliased}\" — plain \"${layerType}\" is not a registered Deck JSON layer class`,\n });\n }\n }\n\n for (const prop of COLOR_SCALE_ACCESSOR_PROPS) {\n const value = layer[prop];\n if (!isPlainObject(value)) continue;\n\n if (\n value['@@type'] === 'ColorScale' &&\n value['@@function'] !== 'colorScale'\n ) {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message:\n 'use {\"@@function\":\"colorScale\",\"field\":\"<column>\",\"type\":\"...\",\"scheme\":\"...\",\"domain\":\"auto\"} — {\"@@type\":\"ColorScale\",\"column\":\"...\"} is not valid colorScale syntax',\n });\n continue;\n }\n\n if (value['@@function'] === 'colorScale') {\n if (typeof value.field !== 'string' || !value.field.trim()) {\n if (typeof value.column === 'string' && value.column.trim()) {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message:\n 'colorScale uses \"field\" for the column name, not \"column\" — rename column → field',\n });\n } else {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message:\n 'colorScale requires a non-empty string \"field\" with the exact column name',\n });\n }\n }\n const schemeIssue = getColorScaleTypeSchemeIssue(\n value.type,\n value.scheme,\n );\n if (schemeIssue) {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message: schemeIssue,\n });\n }\n const thresholdsIssue = getColorScaleThresholdsIssue(\n value.type,\n value.thresholds,\n );\n if (thresholdsIssue) {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message: thresholdsIssue,\n });\n }\n }\n }\n\n const binding =\n layer._sqlroomsBinding && typeof layer._sqlroomsBinding === 'object'\n ? (layer._sqlroomsBinding as Record<string, unknown>)\n : undefined;\n const boundDataset =\n typeof binding?.dataset === 'string' && binding.dataset.trim()\n ? binding.dataset\n : undefined;\n\n if (boundDataset) {\n if (!datasetIdSet.has(boundDataset)) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message: `references unknown dataset \"${boundDataset}\"`,\n });\n }\n } else {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message:\n 'must bind the layer to a config.datasets entry; layer data references and implicit bindings are not durable resource bindings',\n });\n }\n\n if (layerType === 'GeoArrowHeatmapLayer' && 'getWeight' in layer) {\n // Basic: omit getWeight. Custom: numeric constant only.\n const getWeight = layer.getWeight;\n if (config.configMode !== 'custom') {\n issues.push({\n path: `spec.layers.${index}.getWeight`,\n message:\n 'omit getWeight for default density — the basic settings panel has no weight-column control; do not bind a column',\n });\n } else if (\n isPlainObject(getWeight) ||\n (typeof getWeight === 'string' && getWeight.trim().length > 0)\n ) {\n issues.push({\n path: `spec.layers.${index}.getWeight`,\n message:\n 'omit getWeight for default density, or use a numeric constant — column / object accessors are not supported',\n });\n }\n }\n\n // Basic mode: numeric sizes (elevation may use @@=col / scale).\n if (config.configMode !== 'custom') {\n const rejectNonNumericSize = (\n prop: string,\n value: unknown,\n message: string,\n ) => {\n if (value === undefined) return;\n if (typeof value === 'number' && Number.isFinite(value)) return;\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message,\n });\n };\n\n if (layerType === 'GeoArrowScatterplotLayer') {\n rejectNonNumericSize(\n 'getRadius',\n layer.getRadius,\n 'use a positive number (e.g. 4) with radiusUnits \"pixels\" — string/object size accessors are not supported in basic mode',\n );\n }\n\n const LINE_LAYER_TYPES = new Set([\n 'GeoArrowPathLayer',\n 'GeoArrowArcLayer',\n 'GeoArrowTripsLayer',\n ]);\n if (typeof layerType === 'string' && LINE_LAYER_TYPES.has(layerType)) {\n rejectNonNumericSize(\n 'getWidth',\n layer.getWidth,\n 'use a number (e.g. 2) with widthUnits \"pixels\" — string/object size accessors are not supported in basic mode',\n );\n }\n\n if (layerType === 'GeoArrowHeatmapLayer') {\n rejectNonNumericSize(\n 'radiusPixels',\n layer.radiusPixels,\n 'use a positive number (e.g. 30) — string/object size accessors are not supported in basic mode',\n );\n }\n\n if (layerType === 'GeoArrowColumnLayer') {\n rejectNonNumericSize(\n 'radius',\n layer.radius,\n 'use a positive number in meters (e.g. 50) — string/object size accessors are not supported in basic mode',\n );\n }\n\n const ELEVATION_LAYER_TYPES = new Set([\n 'GeoArrowPolygonLayer',\n 'GeoArrowSolidPolygonLayer',\n 'GeoArrowColumnLayer',\n 'GeoArrowH3HexagonLayer',\n ]);\n if (\n typeof layerType === 'string' &&\n ELEVATION_LAYER_TYPES.has(layerType) &&\n layer.getElevation !== undefined\n ) {\n const elev = layer.getElevation;\n if (typeof elev === 'string') {\n const isColumnAccessor = /^@@=[A-Za-z_][\\w]*$/.test(elev.trim());\n if (!isColumnAccessor) {\n issues.push({\n path: `spec.layers.${index}.getElevation`,\n message:\n 'in basic mode use a number (0 for flat), a column accessor \"@@=columnName\", or {\"@@function\":\"scale\",\"field\":\"...\",\"type\":\"linear\",\"domain\":\"auto\",\"range\":[0,200]} — free-form string expressions require configMode \"custom\"',\n });\n }\n } else if (isPlainObject(elev)) {\n const fn = elev['@@function'];\n const field = typeof elev.field === 'string' ? elev.field.trim() : '';\n const typeOk =\n elev.type === undefined ||\n elev.type === 'linear' ||\n (typeof elev.type === 'string' && elev.type.trim() === 'linear');\n if ((fn !== 'scale' && fn !== 'scaleLinear') || !field || !typeOk) {\n issues.push({\n path: `spec.layers.${index}.getElevation`,\n message:\n 'in basic mode use {\"@@function\":\"scale\",\"field\":\"...\",\"type\":\"linear\",\"domain\":\"auto\",\"range\":[0,200]} (or a column accessor \"@@=columnName\")',\n });\n }\n } else if (!(typeof elev === 'number' && Number.isFinite(elev))) {\n issues.push({\n path: `spec.layers.${index}.getElevation`,\n message:\n 'in basic mode use a number (0 for flat), a column accessor \"@@=columnName\", or {\"@@function\":\"scale\",\"field\":\"...\",\"type\":\"linear\",\"domain\":\"auto\",\"range\":[0,200]}',\n });\n }\n }\n }\n\n if (layerType === 'GeoArrowH3HexagonLayer') {\n const getHexagon = layer.getHexagon;\n if (isPlainObject(getHexagon)) {\n issues.push({\n path: `spec.layers.${index}.getHexagon`,\n message:\n 'use getHexagon as a deck.gl attribute string \"@@=h3_column_name\" (or set _sqlroomsBinding.hexagonColumn) — object accessors like {\"@@function\":\"...\",\"column\":\"...\"} are not valid',\n });\n } else {\n const hasHexagonBinding =\n typeof binding?.hexagonColumn === 'string' &&\n (binding.hexagonColumn as string).trim().length > 0;\n const getHexagonAccessor =\n typeof getHexagon === 'string' ? getHexagon.trim() : '';\n const hasGetHexagonAccessor = /^@@=[A-Za-z_][\\w]*$/.test(\n getHexagonAccessor,\n );\n if (\n getHexagonAccessor &&\n !hasGetHexagonAccessor &&\n !hasHexagonBinding\n ) {\n issues.push({\n path: `spec.layers.${index}.getHexagon`,\n message:\n 'use getHexagon as \"@@=h3_column_name\" (a simple column accessor) or set _sqlroomsBinding.hexagonColumn — bare names and expressions are not valid',\n });\n } else if (!hasGetHexagonAccessor && !hasHexagonBinding) {\n issues.push({\n path: `spec.layers.${index}.getHexagon`,\n message:\n 'GeoArrowH3HexagonLayer requires getHexagon (e.g. \"@@=h3_column_name\") or _sqlroomsBinding.hexagonColumn set to the H3 index column',\n });\n }\n }\n }\n\n if (layerType === 'GeoArrowArcLayer') {\n if (layer.getSourcePosition !== undefined) {\n issues.push({\n path: `spec.layers.${index}.getSourcePosition`,\n message:\n 'do not set getSourcePosition — bind the source geometry via _sqlroomsBinding.sourceGeometryColumn only',\n });\n }\n if (layer.getTargetPosition !== undefined) {\n issues.push({\n path: `spec.layers.${index}.getTargetPosition`,\n message:\n 'do not set getTargetPosition — bind the target geometry via _sqlroomsBinding.targetGeometryColumn only',\n });\n }\n const hasSource =\n typeof binding?.sourceGeometryColumn === 'string' &&\n (binding.sourceGeometryColumn as string).trim().length > 0;\n const hasTarget =\n typeof binding?.targetGeometryColumn === 'string' &&\n (binding.targetGeometryColumn as string).trim().length > 0;\n if (!hasSource) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.sourceGeometryColumn`,\n message:\n 'GeoArrowArcLayer requires _sqlroomsBinding.sourceGeometryColumn set to the source geometry column name',\n });\n }\n if (!hasTarget) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.targetGeometryColumn`,\n message:\n 'GeoArrowArcLayer requires _sqlroomsBinding.targetGeometryColumn set to the target geometry column name',\n });\n }\n }\n\n if (layerType === 'GeoArrowTripsLayer') {\n const hasTimestampColumn =\n typeof binding?.timestampColumn === 'string' &&\n (binding.timestampColumn as string).trim().length > 0;\n if (!hasTimestampColumn) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.timestampColumn`,\n message:\n 'GeoArrowTripsLayer requires _sqlroomsBinding.timestampColumn set to the timestamps list column, e.g. \"timestamps\"',\n });\n }\n }\n\n if (\n layerType === 'GeoArrowTripsLayer' ||\n layerType === 'GeoArrowPathLayer'\n ) {\n // LIST(...)/ST_MakeLine needs GROUP BY path/trip id.\n if (boundDataset && config.datasets[boundDataset]) {\n const source = config.datasets[boundDataset]?.source as\n | {transformSql?: string; sqlQuery?: string}\n | undefined;\n const sql = `${source?.transformSql ?? ''} ${source?.sqlQuery ?? ''}`;\n if (hasBadStMakeLinePointOrderBy(sql)) {\n issues.push({\n path: `datasets.${boundDataset}.source`,\n message:\n 'ST_MakeLine is a scalar that takes a LIST of points. Use ST_MakeLine(LIST(ST_Point(lon, lat) ORDER BY waypoint_order)) — never ST_MakeLine(ST_Point(...) ORDER BY ...). ORDER BY is only valid inside LIST.',\n });\n }\n const usesListAgg =\n /\\bST_MakeLine\\s*\\(\\s*LIST\\s*\\(/i.test(sql) ||\n /\\bLIST\\s*\\([^)]*ORDER\\s+BY/i.test(sql);\n const hasGroupBy = /\\bGROUP\\s+BY\\b/i.test(sql);\n if (usesListAgg && !hasGroupBy) {\n issues.push({\n path: `datasets.${boundDataset}.source`,\n message: `${layerType} waypoint aggregation using LIST(...)/ST_MakeLine must include GROUP BY the trip/path/route id column so each trip becomes one linestring. Without GROUP BY, waypoints are not split per trip.`,\n });\n }\n }\n }\n });\n\n const fitDataset = config.fitToData?.dataset;\n if (fitDataset && !datasetIdSet.has(fitDataset)) {\n issues.push({\n path: 'fitToData.dataset',\n message: `references unknown dataset \"${fitDataset}\"`,\n });\n }\n\n if (\n typeof config.mapStyle === 'string' &&\n /^mapbox:/i.test(config.mapStyle.trim())\n ) {\n issues.push({\n path: 'mapStyle',\n message:\n 'mapbox:// styles are not supported (MapLibre cannot fetch that URL scheme). Omit mapStyle to use the host basemap, or use a token-free MapLibre-compatible https:// style URL',\n });\n }\n\n return issues;\n}\n\n/** Rejects invalid durable map writes after sparse patches have been merged. */\nexport function assertDeckMapResourceConfig(config: DeckMapConfig): void {\n const issues = getDeckMapResourceConfigIssues(config);\n if (issues.length > 0) throw new DeckMapResourceConfigError(issues);\n}\n\n/**\n * Returns the package-owned authoring contract for hosts with direct worksheet\n * map capability. Host adapters opt into it; they do not maintain prompt copies.\n */\nexport function getDeckMapResourceAiInstructions(): string {\n return `## Direct worksheet Deck map resources\n\nWhen authoring a worksheet map config, use the resource-native Deck JSON contract:\n- A new map must contain at least one config.datasets entry and at least one spec.layers entry.\n- Every dataset must define source.tableName, source.tableName plus source.transformSql, or source.sqlQuery. Never put sql directly on the dataset object.\n- Bind every layer to a dataset with _sqlroomsBinding.dataset. Never use data: \"@@#datasetId\" or an implicit single-dataset binding as a durable resource binding.\n- Use supported Deck JSON layer classes such as GeoArrowScatterplotLayer, GeoArrowHeatmapLayer, GeoArrowPolygonLayer, GeoArrowSolidPolygonLayer, GeoArrowPathLayer, GeoArrowTripsLayer, GeoArrowArcLayer, GeoArrowColumnLayer, GeoArrowH3HexagonLayer, or GeoJsonLayer. Prefer typed GeoArrow* layers when geometry type is known; GeoJsonLayer is valid for table-backed WKB/GeoJSON via _sqlroomsBinding.\n${getDeckMapSharedAiContractRules()}\n- For table-backed datasets, also pass the same table through the tool's top-level tableName field. A selected table does not replace the required dataset source.\n- transformSql must be a single SELECT and must read from __sqlrooms_source. Use source.sqlQuery only for a standalone pinned query.\n- Use configMode \"basic\" for a straightforward single-layer map (including extruded column/polygon maps with one elevation column via \"@@=col\" or a scale accessor). Use \"custom\" only for advanced properties the basic settings cannot represent; custom mode disables the settings panel and does not relax dataset-source or layer-binding requirements.\n- Prefer data-driven color when a useful varying column exists: getFillColor (or getColor/getSourceColor/getTargetColor for arcs) with {\"@@function\":\"colorScale\",\"field\":\"<column>\",\"type\":\"sequential\"|\"quantile\"|\"categorical\",\"scheme\":\"<name>\",\"domain\":\"auto\"}. Use quantile for skewed numeric, sequential for uniform, categorical for strings. Skip numeric columns where min = max (or all zeros) unless the user names that column; otherwise use flat fill. Exact scheme names (case-sensitive): ${formatColorSchemePromptLists()} — do not invent names. Viridis/Plasma/Inferno require type \"sequential\"; quantile/quantize schemes must be ColorBrewer ramps (YlOrRd, Blues, …).\n- For updates, sparse config patches are allowed because they are merged with the existing resource. For creates, never send empty datasets or layers.\n- When updating only visual properties (color scale, scheme, radius, width, elevation scale, visibility, opacity), send datasets as an empty object {} so the tool schema stays valid and merge keeps the existing dataset registry. Do not omit datasets entirely. Never re-send bare source.tableName without transformSql/sqlQuery — that overwrites geometry SQL and breaks the map. Include real dataset entries only when changing a data source.\n- To remove existing layers or datasets, set replaceLayers and/or replaceDatasets to true and send the complete desired list or registry. Omit them for additive sparse updates. For layer-type switches, set replaceLayers: true with only the new layer — do not keep the old layer as visible: false.\n- If a map write reports an invalid resource config, repair the reported paths and retry the same direct map operation; do not replace it with a dashboard-backed map.\n\nMinimal table-backed point map shape:\n{\"configMode\":\"basic\",\"datasets\":{\"places\":{\"source\":{\"tableName\":\"places\"},\"geometryColumn\":\"geom\",\"geometryEncodingHint\":\"wkb\"}},\"spec\":{\"layers\":[{\"@@type\":\"GeoArrowScatterplotLayer\",\"id\":\"places\",\"_sqlroomsBinding\":{\"dataset\":\"places\",\"geometryColumn\":\"geom\"},\"getRadius\":4,\"radiusUnits\":\"pixels\",\"pickable\":true}]},\"fitToData\":{\"dataset\":\"places\",\"geometryColumn\":\"geom\"}}`;\n}\n"]}
package/dist/mosaic.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /** Opt-in Mosaic dashboard adapter for Deck map panels. */
2
2
  export { DECK_MAP_AI_INSTRUCTIONS, createDashboardAgentToolWithDeckMaps, createDashboardWithDeckMapAiTools, createDeckMapAiTools, createDeckMapDashboardAiTools, createDeckMapDashboardTool, createDeckMapConfigTool, createDeckMapPanelFromNativeConfig, DeckMapDashboardConfigParameter, DeckMapConfigToolParameters, DeckMapDashboardToolParameters, getDashboardWithDeckMapAiInstructions, } from './ai';
3
- export type { DeckMapConfigToolParams, DeckMapDashboardConfigToolConfig, DeckMapDashboardToolParams, } from './ai';
3
+ export type { CreateDashboardAgentToolWithDeckMapsOptions, CreateDashboardWithDeckMapAiToolsOptions, CreateDeckMapDashboardToolParams, DeckMapConfigToolParams, DeckMapDashboardConfigToolConfig, DeckMapDashboardToolParams, } from './ai';
4
4
  export { deckMapDashboardAddPanelAction, deckMapDashboardPanelRenderer, } from './dashboard';
5
5
  export { DeckMapDashboardSettings } from './DashboardMapSettings';
6
6
  export { DeckMapSettingsPanel } from './MapSettings';
@@ -1 +1 @@
1
- {"version":3,"file":"mosaic.d.ts","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AACd,YAAY,EACV,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,MAAM,CAAC;AACd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"mosaic.d.ts","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AACd,YAAY,EACV,2CAA2C,EAC3C,wCAAwC,EACxC,gCAAgC,EAChC,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,MAAM,CAAC;AACd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,cAAc,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mosaic.js","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AAMd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,cAAc,mBAAmB,CAAC","sourcesContent":["/** Opt-in Mosaic dashboard adapter for Deck map panels. */\nexport {\n DECK_MAP_AI_INSTRUCTIONS,\n createDashboardAgentToolWithDeckMaps,\n createDashboardWithDeckMapAiTools,\n createDeckMapAiTools,\n createDeckMapDashboardAiTools,\n createDeckMapDashboardTool,\n createDeckMapConfigTool,\n createDeckMapPanelFromNativeConfig,\n DeckMapDashboardConfigParameter,\n DeckMapConfigToolParameters,\n DeckMapDashboardToolParameters,\n getDashboardWithDeckMapAiInstructions,\n} from './ai';\nexport type {\n DeckMapConfigToolParams,\n DeckMapDashboardConfigToolConfig,\n DeckMapDashboardToolParams,\n} from './ai';\nexport {\n deckMapDashboardAddPanelAction,\n deckMapDashboardPanelRenderer,\n} from './dashboard';\nexport {DeckMapDashboardSettings} from './DashboardMapSettings';\nexport {DeckMapSettingsPanel} from './MapSettings';\nexport {createDeckMapDashboardSliceOptions} from './dashboardIntegration';\nexport * from './dashboardConfig';\n"]}
1
+ {"version":3,"file":"mosaic.js","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AASd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,cAAc,mBAAmB,CAAC","sourcesContent":["/** Opt-in Mosaic dashboard adapter for Deck map panels. */\nexport {\n DECK_MAP_AI_INSTRUCTIONS,\n createDashboardAgentToolWithDeckMaps,\n createDashboardWithDeckMapAiTools,\n createDeckMapAiTools,\n createDeckMapDashboardAiTools,\n createDeckMapDashboardTool,\n createDeckMapConfigTool,\n createDeckMapPanelFromNativeConfig,\n DeckMapDashboardConfigParameter,\n DeckMapConfigToolParameters,\n DeckMapDashboardToolParameters,\n getDashboardWithDeckMapAiInstructions,\n} from './ai';\nexport type {\n CreateDashboardAgentToolWithDeckMapsOptions,\n CreateDashboardWithDeckMapAiToolsOptions,\n CreateDeckMapDashboardToolParams,\n DeckMapConfigToolParams,\n DeckMapDashboardConfigToolConfig,\n DeckMapDashboardToolParams,\n} from './ai';\nexport {\n deckMapDashboardAddPanelAction,\n deckMapDashboardPanelRenderer,\n} from './dashboard';\nexport {DeckMapDashboardSettings} from './DashboardMapSettings';\nexport {DeckMapSettingsPanel} from './MapSettings';\nexport {createDeckMapDashboardSliceOptions} from './dashboardIntegration';\nexport * from './dashboardConfig';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"geoarrow.js","sourceRoot":"","sources":["../../src/prepare/geoarrow.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AAGzD,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAE,KAA0B,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,MAAM,CAAC,KAAc,EAAE,KAAa;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACzD,OAAQ,KAA2C,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAyB,EAAE,CAAC,UAAU,EAAE,EAAE,CAC1D,MAAM,CAAC,UAAU,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,EAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,EAAC,CAAC;AAC5D,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,EAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAC,CAAC;AAC3C,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,EAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAC,CAAC;AAC3C,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAc;IAC/C,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,UAAU,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,EAAC,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAC,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACtC,IAAI,IAAI,EAAE,CAAC;YACT,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAC,CAAC;AACxC,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,EAAC,IAAI,EAAE,cAAc,EAAE,WAAW,EAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAAkC;IAElC,OAAO;QACL,gBAAgB;QAChB,qBAAqB;QACrB,qBAAqB;QACrB,0BAA0B;QAC1B,kBAAkB;QAClB,uBAAuB;KACxB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,KAAc,EACd,QAAkC;IAElC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,gBAAgB;YACnB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,qBAAqB;YACxB,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,qBAAqB;YACxB,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,0BAA0B;YAC7B,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAC1C,KAAK,kBAAkB;YACrB,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,uBAAuB;YAC1B,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACvC;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,KAAkB,EAClB,QAAgC;IAEhC,OAAO,sBAAsB,CAAC;QAC5B,KAAK;QACL,kBAAkB,EAAE,QAAQ,CAAC,UAAU;QACvC,aAAa,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC1B,6BAA6B,CAC3B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAC7B,QAAQ,CAAC,QAAQ,CAClB;KACJ,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {ResolvedGeometryColumn, ResolvedGeometryEncoding} from './types';\n\nfunction itemLength(value: unknown) {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (value && typeof value === 'object' && 'length' in value) {\n return Number((value as {length: number}).length);\n }\n return 0;\n}\n\nfunction itemAt(value: unknown, index: number): unknown {\n if (Array.isArray(value)) {\n return value[index];\n }\n if (value && typeof value === 'object' && 'get' in value) {\n return (value as {get: (index: number) => unknown}).get(index);\n }\n return undefined;\n}\n\nfunction toCoordinates(value: unknown): number[] {\n return Array.from(value as Iterable<number>, (coordinate) =>\n Number(coordinate),\n );\n}\n\nfunction pointToGeometry(value: unknown) {\n return {type: 'Point', coordinates: toCoordinates(value)};\n}\n\nfunction multiPointToGeometry(value: unknown) {\n const coordinates = [];\n for (let index = 0; index < itemLength(value); index++) {\n const point = itemAt(value, index);\n if (point) {\n coordinates.push(toCoordinates(point));\n }\n }\n return {type: 'MultiPoint', coordinates};\n}\n\nfunction lineStringToGeometry(value: unknown) {\n const coordinates = [];\n for (let index = 0; index < itemLength(value); index++) {\n const point = itemAt(value, index);\n if (point) {\n coordinates.push(toCoordinates(point));\n }\n }\n return {type: 'LineString', coordinates};\n}\n\nfunction multiLineStringToGeometry(value: unknown) {\n const coordinates = [];\n for (let index = 0; index < itemLength(value); index++) {\n const lineString = itemAt(value, index);\n if (lineString) {\n coordinates.push(lineStringToGeometry(lineString).coordinates);\n }\n }\n return {type: 'MultiLineString', coordinates};\n}\n\nfunction polygonToGeometry(value: unknown) {\n const coordinates = [];\n for (let ringIndex = 0; ringIndex < itemLength(value); ringIndex++) {\n const ring = itemAt(value, ringIndex);\n if (ring) {\n coordinates.push(lineStringToGeometry(ring).coordinates);\n }\n }\n return {type: 'Polygon', coordinates};\n}\n\nfunction multiPolygonToGeometry(value: unknown) {\n const coordinates = [];\n for (let polygonIndex = 0; polygonIndex < itemLength(value); polygonIndex++) {\n const polygon = itemAt(value, polygonIndex);\n if (polygon) {\n coordinates.push(polygonToGeometry(polygon).coordinates);\n }\n }\n return {type: 'MultiPolygon', coordinates};\n}\n\nexport function isDirectGeoArrowEncoding(\n encoding: ResolvedGeometryEncoding,\n): boolean {\n return [\n 'geoarrow.point',\n 'geoarrow.multipoint',\n 'geoarrow.linestring',\n 'geoarrow.multilinestring',\n 'geoarrow.polygon',\n 'geoarrow.multipolygon',\n ].includes(encoding);\n}\n\nexport function convertGeoArrowCellToGeometry(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) {\n return null;\n }\n\n switch (encoding) {\n case 'geoarrow.point':\n return pointToGeometry(value);\n case 'geoarrow.multipoint':\n return multiPointToGeometry(value);\n case 'geoarrow.linestring':\n return lineStringToGeometry(value);\n case 'geoarrow.multilinestring':\n return multiLineStringToGeometry(value);\n case 'geoarrow.polygon':\n return polygonToGeometry(value);\n case 'geoarrow.multipolygon':\n return multiPolygonToGeometry(value);\n default:\n return null;\n }\n}\n\nexport function buildNativeGeoArrowBinaryData(\n table: arrow.Table,\n geometry: ResolvedGeometryColumn,\n): unknown {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: geometry.columnName,\n getGeometryAt: (rowIndex) =>\n convertGeoArrowCellToGeometry(\n geometry.vector.get(rowIndex),\n geometry.encoding,\n ),\n });\n}\n"]}
1
+ {"version":3,"file":"geoarrow.js","sourceRoot":"","sources":["../../src/prepare/geoarrow.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {ResolvedGeometryColumn, ResolvedGeometryEncoding} from './types';\n\nfunction itemLength(value: unknown) {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (value && typeof value === 'object' && 'length' in value) {\n return Number((value as {length: number}).length);\n }\n return 0;\n}\n\nfunction itemAt(value: unknown, index: number): unknown {\n if (Array.isArray(value)) {\n return value[index];\n }\n if (value && typeof value === 'object' && 'get' in value) {\n return (value as {get: (index: number) => unknown}).get(index);\n }\n return undefined;\n}\n\nfunction toCoordinates(value: unknown): number[] {\n return Array.from(value as Iterable<number>, (coordinate) =>\n Number(coordinate),\n );\n}\n\nfunction pointToGeometry(value: unknown) {\n return {type: 'Point', coordinates: toCoordinates(value)};\n}\n\nfunction multiPointToGeometry(value: unknown) {\n const coordinates: number[][] = [];\n for (let index = 0; index < itemLength(value); index++) {\n const point = itemAt(value, index);\n if (point) {\n coordinates.push(toCoordinates(point));\n }\n }\n return {type: 'MultiPoint', coordinates};\n}\n\nfunction lineStringToGeometry(value: unknown) {\n const coordinates: number[][] = [];\n for (let index = 0; index < itemLength(value); index++) {\n const point = itemAt(value, index);\n if (point) {\n coordinates.push(toCoordinates(point));\n }\n }\n return {type: 'LineString', coordinates};\n}\n\nfunction multiLineStringToGeometry(value: unknown) {\n const coordinates: number[][][] = [];\n for (let index = 0; index < itemLength(value); index++) {\n const lineString = itemAt(value, index);\n if (lineString) {\n coordinates.push(lineStringToGeometry(lineString).coordinates);\n }\n }\n return {type: 'MultiLineString', coordinates};\n}\n\nfunction polygonToGeometry(value: unknown) {\n const coordinates: number[][][] = [];\n for (let ringIndex = 0; ringIndex < itemLength(value); ringIndex++) {\n const ring = itemAt(value, ringIndex);\n if (ring) {\n coordinates.push(lineStringToGeometry(ring).coordinates);\n }\n }\n return {type: 'Polygon', coordinates};\n}\n\nfunction multiPolygonToGeometry(value: unknown) {\n const coordinates: number[][][][] = [];\n for (let polygonIndex = 0; polygonIndex < itemLength(value); polygonIndex++) {\n const polygon = itemAt(value, polygonIndex);\n if (polygon) {\n coordinates.push(polygonToGeometry(polygon).coordinates);\n }\n }\n return {type: 'MultiPolygon', coordinates};\n}\n\nexport function isDirectGeoArrowEncoding(\n encoding: ResolvedGeometryEncoding,\n): boolean {\n return [\n 'geoarrow.point',\n 'geoarrow.multipoint',\n 'geoarrow.linestring',\n 'geoarrow.multilinestring',\n 'geoarrow.polygon',\n 'geoarrow.multipolygon',\n ].includes(encoding);\n}\n\nexport function convertGeoArrowCellToGeometry(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) {\n return null;\n }\n\n switch (encoding) {\n case 'geoarrow.point':\n return pointToGeometry(value);\n case 'geoarrow.multipoint':\n return multiPointToGeometry(value);\n case 'geoarrow.linestring':\n return lineStringToGeometry(value);\n case 'geoarrow.multilinestring':\n return multiLineStringToGeometry(value);\n case 'geoarrow.polygon':\n return polygonToGeometry(value);\n case 'geoarrow.multipolygon':\n return multiPolygonToGeometry(value);\n default:\n return null;\n }\n}\n\nexport function buildNativeGeoArrowBinaryData(\n table: arrow.Table,\n geometry: ResolvedGeometryColumn,\n): unknown {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: geometry.columnName,\n getGeometryAt: (rowIndex) =>\n convertGeoArrowCellToGeometry(\n geometry.vector.get(rowIndex),\n geometry.encoding,\n ),\n });\n}\n"]}
@@ -1,3 +1,13 @@
1
+ import type * as arrow from 'apache-arrow';
1
2
  import type { GeometryDecoder } from './geometryDecoder';
3
+ import type { PreparedGeoArrowLayerData, ResolvedGeometryEncoding } from './types';
4
+ /** Promote WKB/WKT Points only — no silent polygon centroid. */
5
+ export declare function promoteToPointPositions(table: arrow.Table, columnName: string, encoding: ResolvedGeometryEncoding): PreparedGeoArrowLayerData | null;
6
+ export declare function isPointPositionLayer(layerType: string): boolean;
7
+ /**
8
+ * Extra guidance when a typed GeoArrow layer cannot promote WKB/WKT geometry.
9
+ * Mixed geometry columns must use GeoJsonLayer or an ST_GeometryType filter.
10
+ */
11
+ export declare function describeGeoArrowPromotionFailure(layerType: string, encoding: ResolvedGeometryEncoding, table: arrow.Table, columnName: string): string;
2
12
  export declare const wkbGeometryDecoder: GeometryDecoder;
3
13
  //# sourceMappingURL=wkbDecoder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wkbDecoder.d.ts","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAsevD,eAAO,MAAM,kBAAkB,EAAE,eAmFhC,CAAC"}
1
+ {"version":3,"file":"wkbDecoder.d.ts","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAU3C,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAmYjB,gEAAgE;AAChE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,wBAAwB,GACjC,yBAAyB,GAAG,IAAI,CAElC;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/D;AAsCD;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,wBAAwB,EAClC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CA4BR;AA8GD,eAAO,MAAM,kBAAkB,EAAE,eAoFhC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { WKBLoader, WKTLoader } from '@loaders.gl/wkt';
2
2
  import { Field, FixedSizeList, Float64, List, makeData, Table, Vector, } from 'apache-arrow';
3
3
  import { buildBinaryGeoJsonData } from './toGeoJsonBinary';
4
- import { parseWKBHeader, readWKBLineStringXY, readWKBPointXY, visitWKBMultiPolygonCoordinates, visitWKBPolygonCoordinates, WKB_LINESTRING, WKB_MULTIPOLYGON, WKB_POINT, WKB_POLYGON, } from './wkbParser';
4
+ import { parseWKBHeader, readWKBLineStringXY, readWKBMultiLineStringXY, readWKBPointXY, visitWKBPolygonCoordinates, WKB_LINESTRING, WKB_MULTILINESTRING, WKB_MULTIPOLYGON, WKB_POINT, WKB_POLYGON, } from './wkbParser';
5
5
  const COORD_FIELD = new Field('xy', new Float64(), false);
6
6
  const VERTEX_TYPE = new FixedSizeList(2, COORD_FIELD);
7
7
  const VERTEX_FIELD = new Field('', VERTEX_TYPE, true);
@@ -166,11 +166,6 @@ function tryPromotePolygonTable(table, columnName, encoding) {
166
166
  if (geom.type === 'Polygon') {
167
167
  appendPolygonCoordinates(geom.coordinates, ringOffsetsList, xyList);
168
168
  }
169
- else if (geom.type === 'MultiPolygon') {
170
- for (const polygon of geom.coordinates) {
171
- appendPolygonCoordinates(polygon, ringOffsetsList, xyList);
172
- }
173
- }
174
169
  else
175
170
  return null;
176
171
  continue;
@@ -184,11 +179,6 @@ function tryPromotePolygonTable(table, columnName, encoding) {
184
179
  return null;
185
180
  }
186
181
  }
187
- else if (hdr.geomType === WKB_MULTIPOLYGON) {
188
- if (!visitWKBMultiPolygonCoordinates(buf, hdr, polygonVisitor)) {
189
- return null;
190
- }
191
- }
192
182
  else
193
183
  return null;
194
184
  }
@@ -293,14 +283,85 @@ const POINT_LAYERS = new Set([
293
283
  'GeoArrowColumnLayer',
294
284
  'GeoArrowArcLayer',
295
285
  ]);
286
+ /** Scatter / heatmap / column (not OD arcs). */
287
+ const POINT_POSITION_LAYERS = new Set([
288
+ 'GeoArrowScatterplotLayer',
289
+ 'GeoArrowHeatmapLayer',
290
+ 'GeoArrowColumnLayer',
291
+ ]);
296
292
  const POLYGON_LAYERS = new Set([
297
293
  'GeoArrowPolygonLayer',
298
294
  'GeoArrowSolidPolygonLayer',
299
295
  ]);
300
296
  const PATH_LAYERS = new Set(['GeoArrowPathLayer', 'GeoArrowTripsLayer']);
297
+ /** Promote WKB/WKT Points only — no silent polygon centroid. */
298
+ export function promoteToPointPositions(table, columnName, encoding) {
299
+ return tryPromotePointTable(table, columnName, encoding);
300
+ }
301
+ export function isPointPositionLayer(layerType) {
302
+ return POINT_POSITION_LAYERS.has(layerType);
303
+ }
304
+ const WKB_TYPE_NAMES = {
305
+ [WKB_POINT]: 'Point',
306
+ [WKB_LINESTRING]: 'LineString',
307
+ [WKB_POLYGON]: 'Polygon',
308
+ [WKB_MULTILINESTRING]: 'MultiLineString',
309
+ [WKB_MULTIPOLYGON]: 'MultiPolygon',
310
+ };
311
+ function uniqueSortedTypes(types) {
312
+ return [...new Set(types)].sort();
313
+ }
314
+ function sampleGeometryTypeNames(table, columnName, encoding) {
315
+ try {
316
+ const parsed = getSampleGeometryTypes(table, columnName, encoding);
317
+ if (parsed && parsed.length > 0) {
318
+ return uniqueSortedTypes(parsed);
319
+ }
320
+ }
321
+ catch {
322
+ // Fall through to WKB header sampling.
323
+ }
324
+ try {
325
+ const wkbTypes = getSampleWKBGeomTypes(table, columnName);
326
+ if (!wkbTypes || wkbTypes.length === 0)
327
+ return null;
328
+ return uniqueSortedTypes(wkbTypes.map((t) => WKB_TYPE_NAMES[t] ?? `type:${t}`));
329
+ }
330
+ catch {
331
+ return null;
332
+ }
333
+ }
334
+ /**
335
+ * Extra guidance when a typed GeoArrow layer cannot promote WKB/WKT geometry.
336
+ * Mixed geometry columns must use GeoJsonLayer or an ST_GeometryType filter.
337
+ */
338
+ export function describeGeoArrowPromotionFailure(layerType, encoding, table, columnName) {
339
+ const sampled = sampleGeometryTypeNames(table, columnName, encoding);
340
+ const sampledText = sampled && sampled.length > 0
341
+ ? ` Sampled geometry types: ${sampled.join(', ')}.`
342
+ : '';
343
+ if (POLYGON_LAYERS.has(layerType)) {
344
+ return (`${sampledText} GeoArrowPolygonLayer requires only Polygon rows.` +
345
+ ` Use GeoJsonLayer for MultiPolygon or mixed geometry columns, or filter with` +
346
+ ` WHERE ST_GeometryType(geom) = 'POLYGON'.`);
347
+ }
348
+ if (PATH_LAYERS.has(layerType)) {
349
+ return (`${sampledText} GeoArrowPathLayer requires only LineString/MultiLineString rows.` +
350
+ ` For mixed geometry columns use GeoJsonLayer, or filter with` +
351
+ ` WHERE ST_GeometryType(geom) IN ('LINESTRING','MULTILINESTRING').`);
352
+ }
353
+ if (POINT_LAYERS.has(layerType)) {
354
+ return (`${sampledText} This point layer requires Point geometry.` +
355
+ ` For mixed geometry columns use GeoJsonLayer, or filter/transform to points.`);
356
+ }
357
+ return sampledText;
358
+ }
301
359
  /**
302
- * Promotes WKB/WKT LineString geometries to a native GeoArrow LineString vector
303
- * (List<FixedSizeList<2, Float64>>). Returns null if any geometry is not a LineString.
360
+ * Promotes WKB/WKT LineString geometries (and single-part MultiLineString) to a
361
+ * native GeoArrow LineString vector (List<FixedSizeList<2, Float64>>).
362
+ * Multi-part MultiLineStrings are rejected — stitching parts would draw
363
+ * artificial segments between disjoint routes. Returns null if any non-null
364
+ * geometry is not a promotable line type.
304
365
  */
305
366
  function tryPromoteLineStringTable(table, columnName, encoding) {
306
367
  const vector = table.getChild(columnName);
@@ -328,16 +389,29 @@ function tryPromoteLineStringTable(table, columnName, encoding) {
328
389
  nullCount++;
329
390
  continue;
330
391
  }
331
- if (geom.type !== 'LineString')
392
+ if (geom.type === 'LineString') {
393
+ coords = geom.coordinates.map((c) => [c[0], c[1]]);
394
+ }
395
+ else if (geom.type === 'MultiLineString') {
396
+ const parts = geom.coordinates;
397
+ // Only single-part MultiLineString promotes cleanly to PathLayer.
398
+ if (parts.length !== 1 || !parts[0]?.length)
399
+ return null;
400
+ coords = parts[0].map((c) => [c[0], c[1]]);
401
+ }
402
+ else {
332
403
  return null;
333
- coords = geom.coordinates.map((c) => [c[0], c[1]]);
404
+ }
334
405
  }
335
406
  else {
336
407
  const buf = toArrayBuffer(raw);
337
408
  const hdr = parseWKBHeader(buf);
338
409
  if (!hdr)
339
410
  return null;
340
- coords = readWKBLineStringXY(buf, hdr);
411
+ coords =
412
+ hdr.geomType === WKB_MULTILINESTRING
413
+ ? readWKBMultiLineStringXY(buf, hdr)
414
+ : readWKBLineStringXY(buf, hdr);
341
415
  if (!coords)
342
416
  return null;
343
417
  }
@@ -386,10 +460,11 @@ export const wkbGeometryDecoder = {
386
460
  return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'Point', (geometryType) => geometryType === WKB_POINT);
387
461
  }
388
462
  if (POLYGON_LAYERS.has(layerType)) {
389
- return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'Polygon' || geometryType === 'MultiPolygon', (geometryType) => geometryType === WKB_POLYGON || geometryType === WKB_MULTIPOLYGON);
463
+ return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'Polygon', (geometryType) => geometryType === WKB_POLYGON);
390
464
  }
391
465
  if (PATH_LAYERS.has(layerType)) {
392
- return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'LineString', (geometryType) => geometryType === WKB_LINESTRING);
466
+ return sampledGeometriesMatch(table, columnName, encoding, (geometryType) => geometryType === 'LineString' || geometryType === 'MultiLineString', (geometryType) => geometryType === WKB_LINESTRING ||
467
+ geometryType === WKB_MULTILINESTRING);
393
468
  }
394
469
  return false;
395
470
  },
@@ -1 +1 @@
1
- {"version":3,"file":"wkbDecoder.js","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import {WKBLoader, WKTLoader} from '@loaders.gl/wkt';\nimport type * as arrow from 'apache-arrow';\nimport {\n Field,\n FixedSizeList,\n Float64,\n List,\n makeData,\n Table,\n Vector,\n} from 'apache-arrow';\nimport type {GeometryDecoder} from './geometryDecoder';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {\n PreparedGeoArrowLayerData,\n ResolvedGeometryEncoding,\n} from './types';\nimport {\n parseWKBHeader,\n readWKBLineStringXY,\n readWKBPointXY,\n visitWKBMultiPolygonCoordinates,\n visitWKBPolygonCoordinates,\n WKB_LINESTRING,\n WKB_MULTIPOLYGON,\n WKB_POINT,\n WKB_POLYGON,\n} from './wkbParser';\n\nconst COORD_FIELD = new Field('xy', new Float64(), false);\nconst VERTEX_TYPE = new FixedSizeList(2, COORD_FIELD);\nconst VERTEX_FIELD = new Field('', VERTEX_TYPE, true);\nconst RING_TYPE = new List(VERTEX_FIELD);\nconst RING_FIELD = new Field('', RING_TYPE, true);\nconst POLYGON_TYPE = new List(RING_FIELD);\n\nconst GEOMETRY_SAMPLE_LIMIT = 100;\nconst BITS_PER_VALIDITY_BYTE = 8;\n\nfunction toArrayBuffer(value: unknown): ArrayBuffer {\n if (ArrayBuffer.isView(value)) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength),\n 0,\n );\n return copy.buffer;\n }\n return value as ArrayBuffer;\n}\n\nfunction isWKTEncoding(\n encoding: ResolvedGeometryEncoding,\n value: unknown,\n): boolean {\n return (\n encoding === 'wkt' ||\n encoding === 'geoarrow.wkt' ||\n (encoding === 'unknown' && typeof value === 'string')\n );\n}\n\nfunction buildNullBitmap(\n n: number,\n isNull: Uint8Array,\n nullCount: number,\n): Uint8Array | null {\n if (nullCount === 0) return null;\n const bitmap = new Uint8Array(Math.ceil(n / BITS_PER_VALIDITY_BYTE));\n for (let i = 0; i < n; i++) {\n if (isNull[i] !== 1) setValidityBit(bitmap, i);\n }\n return bitmap;\n}\n\nfunction setValidityBit(bitmap: Uint8Array, rowIndex: number) {\n const byteIndex = Math.floor(rowIndex / BITS_PER_VALIDITY_BYTE);\n const bitIndex = rowIndex % BITS_PER_VALIDITY_BYTE;\n bitmap[byteIndex]! |= 1 << bitIndex;\n}\n\nfunction buildPromotedResult(\n table: arrow.Table,\n columnName: string,\n promotedGeometry: arrow.Vector,\n encoding: PreparedGeoArrowLayerData['encoding'],\n): PreparedGeoArrowLayerData {\n const columns: Record<string, arrow.Vector> = {};\n for (const field of table.schema.fields) {\n columns[field.name] =\n field.name === columnName\n ? promotedGeometry\n : (table.getChild(field.name) as arrow.Vector);\n }\n const promotedTable = new Table(columns);\n return {\n table: promotedTable,\n geometryColumnName: columnName,\n geometryColumn: promotedTable.getChild(columnName)!,\n encoding,\n source: 'promoted',\n };\n}\n\nfunction parseGeometryValue(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) return null;\n\n try {\n if (isWKTEncoding(encoding, value)) {\n // Keep WKT support for ST_AsText(...) and geoarrow.wkt inputs.\n // The upstream WKB parser plan does not cover WKT.\n // See: https://github.com/geoarrow/geoarrow-js/issues/54\n return (\n WKTLoader.parseTextSync?.(String(value), {wkt: {crs: false}}) ?? null\n );\n }\n\n return (\n WKBLoader.parseSync?.(toArrayBuffer(value), {\n wkb: {shape: 'geojson-geometry'},\n }) ?? null\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes('WKB: Unsupported geometry type: 0') ||\n message.includes('WKB: Unsupported iso-wkb type')\n ) {\n throw new Error(\n 'DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckJsonMap.',\n );\n }\n throw error instanceof Error ? error : new Error(message);\n }\n}\n\nfunction getSampleWKBGeomTypes(\n table: arrow.Table,\n columnName: string,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): number[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geomTypes: number[] = [];\n for (let i = 0; i < table.numRows; i++) {\n const raw = vector.get(i);\n if (raw == null) continue;\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n geomTypes.push(hdr.geomType);\n if (geomTypes.length >= sampleLimit) break;\n }\n return geomTypes;\n}\n\nfunction getSampleGeometryTypes(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): string[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geometryTypes: string[] = [];\n\n for (let i = 0; i < table.numRows; i++) {\n const geometry = parseGeometryValue(vector.get(i), encoding);\n if (!geometry) continue;\n geometryTypes.push(geometry.type);\n if (geometryTypes.length >= sampleLimit) break;\n }\n return geometryTypes;\n}\n\nfunction appendPolygonCoordinates(\n rings: number[][][],\n ringOffsetsList: number[],\n xyList: number[],\n) {\n for (const ring of rings) {\n ringOffsetsList.push(xyList.length / 2);\n for (const point of ring) {\n xyList.push(point[0]!, point[1]!);\n }\n }\n}\n\nfunction sampledGeometriesMatch(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n matchesParsedType: (geometryType: string) => boolean,\n matchesWKBType: (geometryType: number) => boolean,\n) {\n try {\n const geometryTypes = getSampleGeometryTypes(table, columnName, encoding);\n return geometryTypes != null && geometryTypes.every(matchesParsedType);\n } catch {\n try {\n const geomTypes = getSampleWKBGeomTypes(table, columnName);\n return geomTypes != null && geomTypes.every(matchesWKBType);\n } catch {\n return false;\n }\n }\n}\n\nfunction tryPromotePolygonTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const polygonOffsets = new Int32Array(n + 1);\n const ringOffsetsList: number[] = [];\n const xyList: number[] = [];\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n const polygonVisitor = {\n onRingStart: () => ringOffsetsList.push(xyList.length / 2),\n onCoordinate: (x: number, y: number) => xyList.push(x, y),\n };\n\n for (let i = 0; i < n; i++) {\n polygonOffsets[i] = ringOffsetsList.length;\n const raw = vector.get(i);\n\n if (raw == null) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n if (geom.type === 'Polygon') {\n appendPolygonCoordinates(\n geom.coordinates as number[][][],\n ringOffsetsList,\n xyList,\n );\n } else if (geom.type === 'MultiPolygon') {\n for (const polygon of geom.coordinates as number[][][][]) {\n appendPolygonCoordinates(polygon, ringOffsetsList, xyList);\n }\n } else return null;\n continue;\n }\n\n const buf = toArrayBuffer(raw);\n const hdr = parseWKBHeader(buf);\n if (!hdr) return null;\n\n if (hdr.geomType === WKB_POLYGON) {\n if (visitWKBPolygonCoordinates(buf, hdr, polygonVisitor) == null) {\n return null;\n }\n } else if (hdr.geomType === WKB_MULTIPOLYGON) {\n if (!visitWKBMultiPolygonCoordinates(buf, hdr, polygonVisitor)) {\n return null;\n }\n } else return null;\n }\n polygonOffsets[n] = ringOffsetsList.length;\n\n const totalRings = ringOffsetsList.length;\n const totalPoints = xyList.length / 2;\n\n const ringOffsets = new Int32Array(totalRings + 1);\n for (let j = 0; j < totalRings; j++) ringOffsets[j] = ringOffsetsList[j]!;\n ringOffsets[totalRings] = totalPoints;\n\n const flatCoords = new Float64Array(xyList);\n const floatData = makeData({\n type: new Float64(),\n length: totalPoints * 2,\n data: flatCoords,\n });\n const pointData = makeData({\n type: VERTEX_TYPE,\n length: totalPoints,\n child: floatData,\n });\n const ringData = makeData({\n type: RING_TYPE,\n length: totalRings,\n valueOffsets: ringOffsets,\n child: pointData,\n });\n const polyData = makeData({\n type: POLYGON_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n valueOffsets: polygonOffsets,\n child: ringData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([polyData]),\n 'geoarrow.polygon',\n );\n}\n\n/**\n * Attempt to promote WKB/WKT Point geometries into a native GeoArrow\n * FixedSizeList column. Returns `null` if any non-null geometry is not\n * a Point, so callers can fall back to the GeoJSON binary path.\n */\nfunction tryPromotePointTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const xyValues = new Float64Array(n * 2);\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n\n const markNullPoint = (rowIndex: number) => {\n isNull[rowIndex] = 1;\n xyValues[rowIndex * 2] = Number.NaN;\n xyValues[rowIndex * 2 + 1] = Number.NaN;\n nullCount++;\n };\n\n for (let i = 0; i < n; i++) {\n const raw = vector.get(i);\n if (raw == null) {\n markNullPoint(i);\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n markNullPoint(i);\n continue;\n }\n if (geom.type !== 'Point') return null;\n const c = geom.coordinates as number[];\n xyValues[i * 2] = c[0]!;\n xyValues[i * 2 + 1] = c[1]!;\n continue;\n }\n\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n const xy = readWKBPointXY(hdr);\n if (!xy) return null;\n xyValues[i * 2] = xy[0];\n xyValues[i * 2 + 1] = xy[1];\n }\n\n const floatData = makeData({\n type: new Float64(),\n length: n * 2,\n data: xyValues,\n });\n const geomData = makeData({\n type: VERTEX_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n child: floatData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([geomData]),\n 'geoarrow.point',\n );\n}\n\nconst POINT_LAYERS = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n 'GeoArrowArcLayer',\n]);\n\nconst POLYGON_LAYERS = new Set([\n 'GeoArrowPolygonLayer',\n 'GeoArrowSolidPolygonLayer',\n]);\n\nconst PATH_LAYERS = new Set(['GeoArrowPathLayer', 'GeoArrowTripsLayer']);\n\n/**\n * Promotes WKB/WKT LineString geometries to a native GeoArrow LineString vector\n * (List<FixedSizeList<2, Float64>>). Returns null if any geometry is not a LineString.\n */\nfunction tryPromoteLineStringTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const allCoords: Float64Array[] = [];\n const offsets = new Int32Array(n + 1);\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n let totalPoints = 0;\n\n for (let i = 0; i < n; i++) {\n offsets[i] = totalPoints;\n const raw = vector.get(i);\n if (raw == null) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n\n let coords: Array<[number, number]> | null = null;\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n if (geom.type !== 'LineString') return null;\n coords = (geom.coordinates as number[][]).map(\n (c) => [c[0]!, c[1]!] as [number, number],\n );\n } else {\n const buf = toArrayBuffer(raw);\n const hdr = parseWKBHeader(buf);\n if (!hdr) return null;\n coords = readWKBLineStringXY(buf, hdr);\n if (!coords) return null;\n }\n\n const flat = new Float64Array(coords.length * 2);\n for (let j = 0; j < coords.length; j++) {\n flat[j * 2] = coords[j]![0];\n flat[j * 2 + 1] = coords[j]![1];\n }\n allCoords.push(flat);\n totalPoints += coords.length;\n }\n offsets[n] = totalPoints;\n\n const flatValues = new Float64Array(totalPoints * 2);\n let writeOffset = 0;\n for (const chunk of allCoords) {\n flatValues.set(chunk, writeOffset);\n writeOffset += chunk.length;\n }\n\n const floatData = makeData({\n type: new Float64(),\n length: totalPoints * 2,\n data: flatValues,\n });\n const vertexData = makeData({\n type: VERTEX_TYPE,\n length: totalPoints,\n child: floatData,\n });\n const lineStringType = new List(VERTEX_FIELD);\n const lineData = makeData({\n type: lineStringType,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n valueOffsets: offsets,\n child: vertexData,\n });\n\n return buildPromotedResult(\n table,\n columnName,\n new Vector([lineData]),\n 'geoarrow.linestring',\n );\n}\n\nexport const wkbGeometryDecoder: GeometryDecoder = {\n supportsGeoArrowPromotion(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n ) {\n if (\n !['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(\n encoding,\n )\n ) {\n return false;\n }\n\n if (POINT_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) => geometryType === 'Point',\n (geometryType) => geometryType === WKB_POINT,\n );\n }\n\n if (POLYGON_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) =>\n geometryType === 'Polygon' || geometryType === 'MultiPolygon',\n (geometryType) =>\n geometryType === WKB_POLYGON || geometryType === WKB_MULTIPOLYGON,\n );\n }\n\n if (PATH_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) => geometryType === 'LineString',\n (geometryType) => geometryType === WKB_LINESTRING,\n );\n }\n\n return false;\n },\n\n toGeoArrowLike(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n const pointResult = tryPromotePointTable(table, columnName, encoding);\n if (pointResult) return pointResult;\n\n const lineResult = tryPromoteLineStringTable(table, columnName, encoding);\n if (lineResult) return lineResult;\n\n const result = tryPromotePolygonTable(table, columnName, encoding);\n if (result) return result;\n\n throw new Error(\n 'GeoArrow promotion failed: unsupported geometry type for column.',\n );\n },\n\n toGeoJsonBinary(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: columnName,\n getGeometryAt: (rowIndex) => {\n const value = table.getChild(columnName)?.get(rowIndex);\n return parseGeometryValue(value, encoding);\n },\n });\n },\n};\n"]}
1
+ {"version":3,"file":"wkbDecoder.js","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import {WKBLoader, WKTLoader} from '@loaders.gl/wkt';\nimport type * as arrow from 'apache-arrow';\nimport {\n Field,\n FixedSizeList,\n Float64,\n List,\n makeData,\n Table,\n Vector,\n} from 'apache-arrow';\nimport type {GeometryDecoder} from './geometryDecoder';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {\n PreparedGeoArrowLayerData,\n ResolvedGeometryEncoding,\n} from './types';\nimport {\n parseWKBHeader,\n readWKBLineStringXY,\n readWKBMultiLineStringXY,\n readWKBPointXY,\n visitWKBPolygonCoordinates,\n WKB_LINESTRING,\n WKB_MULTILINESTRING,\n WKB_MULTIPOLYGON,\n WKB_POINT,\n WKB_POLYGON,\n} from './wkbParser';\n\nconst COORD_FIELD = new Field('xy', new Float64(), false);\nconst VERTEX_TYPE = new FixedSizeList(2, COORD_FIELD);\nconst VERTEX_FIELD = new Field('', VERTEX_TYPE, true);\nconst RING_TYPE = new List(VERTEX_FIELD);\nconst RING_FIELD = new Field('', RING_TYPE, true);\nconst POLYGON_TYPE = new List(RING_FIELD);\n\nconst GEOMETRY_SAMPLE_LIMIT = 100;\nconst BITS_PER_VALIDITY_BYTE = 8;\n\nfunction toArrayBuffer(value: unknown): ArrayBuffer {\n if (ArrayBuffer.isView(value)) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength),\n 0,\n );\n return copy.buffer;\n }\n return value as ArrayBuffer;\n}\n\nfunction isWKTEncoding(\n encoding: ResolvedGeometryEncoding,\n value: unknown,\n): boolean {\n return (\n encoding === 'wkt' ||\n encoding === 'geoarrow.wkt' ||\n (encoding === 'unknown' && typeof value === 'string')\n );\n}\n\nfunction buildNullBitmap(\n n: number,\n isNull: Uint8Array,\n nullCount: number,\n): Uint8Array | null {\n if (nullCount === 0) return null;\n const bitmap = new Uint8Array(Math.ceil(n / BITS_PER_VALIDITY_BYTE));\n for (let i = 0; i < n; i++) {\n if (isNull[i] !== 1) setValidityBit(bitmap, i);\n }\n return bitmap;\n}\n\nfunction setValidityBit(bitmap: Uint8Array, rowIndex: number) {\n const byteIndex = Math.floor(rowIndex / BITS_PER_VALIDITY_BYTE);\n const bitIndex = rowIndex % BITS_PER_VALIDITY_BYTE;\n bitmap[byteIndex]! |= 1 << bitIndex;\n}\n\nfunction buildPromotedResult(\n table: arrow.Table,\n columnName: string,\n promotedGeometry: arrow.Vector,\n encoding: PreparedGeoArrowLayerData['encoding'],\n): PreparedGeoArrowLayerData {\n const columns: Record<string, arrow.Vector> = {};\n for (const field of table.schema.fields) {\n columns[field.name] =\n field.name === columnName\n ? promotedGeometry\n : (table.getChild(field.name) as arrow.Vector);\n }\n const promotedTable = new Table(columns);\n return {\n table: promotedTable,\n geometryColumnName: columnName,\n geometryColumn: promotedTable.getChild(columnName)!,\n encoding,\n source: 'promoted',\n };\n}\n\nfunction parseGeometryValue(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) return null;\n\n try {\n if (isWKTEncoding(encoding, value)) {\n // Keep WKT support for ST_AsText(...) and geoarrow.wkt inputs.\n // The upstream WKB parser plan does not cover WKT.\n // See: https://github.com/geoarrow/geoarrow-js/issues/54\n return (\n WKTLoader.parseTextSync?.(String(value), {wkt: {crs: false}}) ?? null\n );\n }\n\n return (\n WKBLoader.parseSync?.(toArrayBuffer(value), {\n wkb: {shape: 'geojson-geometry'},\n }) ?? null\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes('WKB: Unsupported geometry type: 0') ||\n message.includes('WKB: Unsupported iso-wkb type')\n ) {\n throw new Error(\n 'DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckJsonMap.',\n );\n }\n throw error instanceof Error ? error : new Error(message);\n }\n}\n\nfunction getSampleWKBGeomTypes(\n table: arrow.Table,\n columnName: string,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): number[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geomTypes: number[] = [];\n for (let i = 0; i < table.numRows; i++) {\n const raw = vector.get(i);\n if (raw == null) continue;\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n geomTypes.push(hdr.geomType);\n if (geomTypes.length >= sampleLimit) break;\n }\n return geomTypes;\n}\n\nfunction getSampleGeometryTypes(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n sampleLimit = GEOMETRY_SAMPLE_LIMIT,\n): string[] | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n const geometryTypes: string[] = [];\n\n for (let i = 0; i < table.numRows; i++) {\n const geometry = parseGeometryValue(vector.get(i), encoding);\n if (!geometry) continue;\n geometryTypes.push(geometry.type);\n if (geometryTypes.length >= sampleLimit) break;\n }\n return geometryTypes;\n}\n\nfunction appendPolygonCoordinates(\n rings: number[][][],\n ringOffsetsList: number[],\n xyList: number[],\n) {\n for (const ring of rings) {\n ringOffsetsList.push(xyList.length / 2);\n for (const point of ring) {\n xyList.push(point[0]!, point[1]!);\n }\n }\n}\n\nfunction sampledGeometriesMatch(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n matchesParsedType: (geometryType: string) => boolean,\n matchesWKBType: (geometryType: number) => boolean,\n) {\n try {\n const geometryTypes = getSampleGeometryTypes(table, columnName, encoding);\n return geometryTypes != null && geometryTypes.every(matchesParsedType);\n } catch {\n try {\n const geomTypes = getSampleWKBGeomTypes(table, columnName);\n return geomTypes != null && geomTypes.every(matchesWKBType);\n } catch {\n return false;\n }\n }\n}\n\nfunction tryPromotePolygonTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const polygonOffsets = new Int32Array(n + 1);\n const ringOffsetsList: number[] = [];\n const xyList: number[] = [];\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n const polygonVisitor = {\n onRingStart: () => ringOffsetsList.push(xyList.length / 2),\n onCoordinate: (x: number, y: number) => xyList.push(x, y),\n };\n\n for (let i = 0; i < n; i++) {\n polygonOffsets[i] = ringOffsetsList.length;\n const raw = vector.get(i);\n\n if (raw == null) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n if (geom.type === 'Polygon') {\n appendPolygonCoordinates(\n geom.coordinates as number[][][],\n ringOffsetsList,\n xyList,\n );\n } else return null;\n continue;\n }\n\n const buf = toArrayBuffer(raw);\n const hdr = parseWKBHeader(buf);\n if (!hdr) return null;\n\n if (hdr.geomType === WKB_POLYGON) {\n if (visitWKBPolygonCoordinates(buf, hdr, polygonVisitor) == null) {\n return null;\n }\n } else return null;\n }\n polygonOffsets[n] = ringOffsetsList.length;\n\n const totalRings = ringOffsetsList.length;\n const totalPoints = xyList.length / 2;\n\n const ringOffsets = new Int32Array(totalRings + 1);\n for (let j = 0; j < totalRings; j++) ringOffsets[j] = ringOffsetsList[j]!;\n ringOffsets[totalRings] = totalPoints;\n\n const flatCoords = new Float64Array(xyList);\n const floatData = makeData({\n type: new Float64(),\n length: totalPoints * 2,\n data: flatCoords,\n });\n const pointData = makeData({\n type: VERTEX_TYPE,\n length: totalPoints,\n child: floatData,\n });\n const ringData = makeData({\n type: RING_TYPE,\n length: totalRings,\n valueOffsets: ringOffsets,\n child: pointData,\n });\n const polyData = makeData({\n type: POLYGON_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n valueOffsets: polygonOffsets,\n child: ringData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([polyData]),\n 'geoarrow.polygon',\n );\n}\n\n/**\n * Attempt to promote WKB/WKT Point geometries into a native GeoArrow\n * FixedSizeList column. Returns `null` if any non-null geometry is not\n * a Point, so callers can fall back to the GeoJSON binary path.\n */\nfunction tryPromotePointTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const xyValues = new Float64Array(n * 2);\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n\n const markNullPoint = (rowIndex: number) => {\n isNull[rowIndex] = 1;\n xyValues[rowIndex * 2] = Number.NaN;\n xyValues[rowIndex * 2 + 1] = Number.NaN;\n nullCount++;\n };\n\n for (let i = 0; i < n; i++) {\n const raw = vector.get(i);\n if (raw == null) {\n markNullPoint(i);\n continue;\n }\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n markNullPoint(i);\n continue;\n }\n if (geom.type !== 'Point') return null;\n const c = geom.coordinates as number[];\n xyValues[i * 2] = c[0]!;\n xyValues[i * 2 + 1] = c[1]!;\n continue;\n }\n\n const hdr = parseWKBHeader(toArrayBuffer(raw));\n if (!hdr) return null;\n const xy = readWKBPointXY(hdr);\n if (!xy) return null;\n xyValues[i * 2] = xy[0];\n xyValues[i * 2 + 1] = xy[1];\n }\n\n const floatData = makeData({\n type: new Float64(),\n length: n * 2,\n data: xyValues,\n });\n const geomData = makeData({\n type: VERTEX_TYPE,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n child: floatData,\n });\n return buildPromotedResult(\n table,\n columnName,\n new Vector([geomData]),\n 'geoarrow.point',\n );\n}\n\nconst POINT_LAYERS = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n 'GeoArrowArcLayer',\n]);\n\n/** Scatter / heatmap / column (not OD arcs). */\nconst POINT_POSITION_LAYERS = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n]);\n\nconst POLYGON_LAYERS = new Set([\n 'GeoArrowPolygonLayer',\n 'GeoArrowSolidPolygonLayer',\n]);\n\nconst PATH_LAYERS = new Set(['GeoArrowPathLayer', 'GeoArrowTripsLayer']);\n\n/** Promote WKB/WKT Points only — no silent polygon centroid. */\nexport function promoteToPointPositions(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n return tryPromotePointTable(table, columnName, encoding);\n}\n\nexport function isPointPositionLayer(layerType: string): boolean {\n return POINT_POSITION_LAYERS.has(layerType);\n}\n\nconst WKB_TYPE_NAMES: Record<number, string> = {\n [WKB_POINT]: 'Point',\n [WKB_LINESTRING]: 'LineString',\n [WKB_POLYGON]: 'Polygon',\n [WKB_MULTILINESTRING]: 'MultiLineString',\n [WKB_MULTIPOLYGON]: 'MultiPolygon',\n};\n\nfunction uniqueSortedTypes(types: string[]): string[] {\n return [...new Set(types)].sort();\n}\n\nfunction sampleGeometryTypeNames(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): string[] | null {\n try {\n const parsed = getSampleGeometryTypes(table, columnName, encoding);\n if (parsed && parsed.length > 0) {\n return uniqueSortedTypes(parsed);\n }\n } catch {\n // Fall through to WKB header sampling.\n }\n try {\n const wkbTypes = getSampleWKBGeomTypes(table, columnName);\n if (!wkbTypes || wkbTypes.length === 0) return null;\n return uniqueSortedTypes(\n wkbTypes.map((t) => WKB_TYPE_NAMES[t] ?? `type:${t}`),\n );\n } catch {\n return null;\n }\n}\n\n/**\n * Extra guidance when a typed GeoArrow layer cannot promote WKB/WKT geometry.\n * Mixed geometry columns must use GeoJsonLayer or an ST_GeometryType filter.\n */\nexport function describeGeoArrowPromotionFailure(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n): string {\n const sampled = sampleGeometryTypeNames(table, columnName, encoding);\n const sampledText =\n sampled && sampled.length > 0\n ? ` Sampled geometry types: ${sampled.join(', ')}.`\n : '';\n\n if (POLYGON_LAYERS.has(layerType)) {\n return (\n `${sampledText} GeoArrowPolygonLayer requires only Polygon rows.` +\n ` Use GeoJsonLayer for MultiPolygon or mixed geometry columns, or filter with` +\n ` WHERE ST_GeometryType(geom) = 'POLYGON'.`\n );\n }\n if (PATH_LAYERS.has(layerType)) {\n return (\n `${sampledText} GeoArrowPathLayer requires only LineString/MultiLineString rows.` +\n ` For mixed geometry columns use GeoJsonLayer, or filter with` +\n ` WHERE ST_GeometryType(geom) IN ('LINESTRING','MULTILINESTRING').`\n );\n }\n if (POINT_LAYERS.has(layerType)) {\n return (\n `${sampledText} This point layer requires Point geometry.` +\n ` For mixed geometry columns use GeoJsonLayer, or filter/transform to points.`\n );\n }\n return sampledText;\n}\n\n/**\n * Promotes WKB/WKT LineString geometries (and single-part MultiLineString) to a\n * native GeoArrow LineString vector (List<FixedSizeList<2, Float64>>).\n * Multi-part MultiLineStrings are rejected — stitching parts would draw\n * artificial segments between disjoint routes. Returns null if any non-null\n * geometry is not a promotable line type.\n */\nfunction tryPromoteLineStringTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) return null;\n\n const n = table.numRows;\n const allCoords: Float64Array[] = [];\n const offsets = new Int32Array(n + 1);\n const isNull = new Uint8Array(n);\n let nullCount = 0;\n let totalPoints = 0;\n\n for (let i = 0; i < n; i++) {\n offsets[i] = totalPoints;\n const raw = vector.get(i);\n if (raw == null) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n\n let coords: Array<[number, number]> | null = null;\n\n if (isWKTEncoding(encoding, raw)) {\n const geom = parseGeometryValue(raw, encoding);\n if (!geom) {\n isNull[i] = 1;\n nullCount++;\n continue;\n }\n if (geom.type === 'LineString') {\n coords = (geom.coordinates as number[][]).map(\n (c) => [c[0]!, c[1]!] as [number, number],\n );\n } else if (geom.type === 'MultiLineString') {\n const parts = geom.coordinates as number[][][];\n // Only single-part MultiLineString promotes cleanly to PathLayer.\n if (parts.length !== 1 || !parts[0]?.length) return null;\n coords = parts[0].map((c) => [c[0]!, c[1]!] as [number, number]);\n } else {\n return null;\n }\n } else {\n const buf = toArrayBuffer(raw);\n const hdr = parseWKBHeader(buf);\n if (!hdr) return null;\n coords =\n hdr.geomType === WKB_MULTILINESTRING\n ? readWKBMultiLineStringXY(buf, hdr)\n : readWKBLineStringXY(buf, hdr);\n if (!coords) return null;\n }\n\n const flat = new Float64Array(coords.length * 2);\n for (let j = 0; j < coords.length; j++) {\n flat[j * 2] = coords[j]![0];\n flat[j * 2 + 1] = coords[j]![1];\n }\n allCoords.push(flat);\n totalPoints += coords.length;\n }\n offsets[n] = totalPoints;\n\n const flatValues = new Float64Array(totalPoints * 2);\n let writeOffset = 0;\n for (const chunk of allCoords) {\n flatValues.set(chunk, writeOffset);\n writeOffset += chunk.length;\n }\n\n const floatData = makeData({\n type: new Float64(),\n length: totalPoints * 2,\n data: flatValues,\n });\n const vertexData = makeData({\n type: VERTEX_TYPE,\n length: totalPoints,\n child: floatData,\n });\n const lineStringType = new List(VERTEX_FIELD);\n const lineData = makeData({\n type: lineStringType,\n length: n,\n nullCount,\n nullBitmap: buildNullBitmap(n, isNull, nullCount),\n valueOffsets: offsets,\n child: vertexData,\n });\n\n return buildPromotedResult(\n table,\n columnName,\n new Vector([lineData]),\n 'geoarrow.linestring',\n );\n}\n\nexport const wkbGeometryDecoder: GeometryDecoder = {\n supportsGeoArrowPromotion(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n ) {\n if (\n !['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(\n encoding,\n )\n ) {\n return false;\n }\n\n if (POINT_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) => geometryType === 'Point',\n (geometryType) => geometryType === WKB_POINT,\n );\n }\n\n if (POLYGON_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) => geometryType === 'Polygon',\n (geometryType) => geometryType === WKB_POLYGON,\n );\n }\n\n if (PATH_LAYERS.has(layerType)) {\n return sampledGeometriesMatch(\n table,\n columnName,\n encoding,\n (geometryType) =>\n geometryType === 'LineString' || geometryType === 'MultiLineString',\n (geometryType) =>\n geometryType === WKB_LINESTRING ||\n geometryType === WKB_MULTILINESTRING,\n );\n }\n\n return false;\n },\n\n toGeoArrowLike(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n const pointResult = tryPromotePointTable(table, columnName, encoding);\n if (pointResult) return pointResult;\n\n const lineResult = tryPromoteLineStringTable(table, columnName, encoding);\n if (lineResult) return lineResult;\n\n const result = tryPromotePolygonTable(table, columnName, encoding);\n if (result) return result;\n\n throw new Error(\n 'GeoArrow promotion failed: unsupported geometry type for column.',\n );\n },\n\n toGeoJsonBinary(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: columnName,\n getGeometryAt: (rowIndex) => {\n const value = table.getChild(columnName)?.get(rowIndex);\n return parseGeometryValue(value, encoding);\n },\n });\n },\n};\n"]}