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

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 (154) hide show
  1. package/README.md +193 -35
  2. package/dist/BlockMapSettings.d.ts.map +1 -1
  3. package/dist/BlockMapSettings.js +4 -16
  4. package/dist/BlockMapSettings.js.map +1 -1
  5. package/dist/DashboardMapSettings.d.ts.map +1 -1
  6. package/dist/DashboardMapSettings.js +7 -10
  7. package/dist/DashboardMapSettings.js.map +1 -1
  8. package/dist/DeckJsonMap.d.ts.map +1 -1
  9. package/dist/DeckJsonMap.js +75 -23
  10. package/dist/DeckJsonMap.js.map +1 -1
  11. package/dist/DeckJsonMapSpec.d.ts +41 -0
  12. package/dist/DeckJsonMapSpec.d.ts.map +1 -1
  13. package/dist/DeckJsonMapSpec.js +2 -0
  14. package/dist/DeckJsonMapSpec.js.map +1 -1
  15. package/dist/DeckMapBasemapSelect.d.ts +9 -0
  16. package/dist/DeckMapBasemapSelect.d.ts.map +1 -0
  17. package/dist/DeckMapBasemapSelect.js +20 -0
  18. package/dist/DeckMapBasemapSelect.js.map +1 -0
  19. package/dist/DeckMapDefaultStylesProvider.d.ts +13 -19
  20. package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
  21. package/dist/DeckMapDefaultStylesProvider.js +11 -18
  22. package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
  23. package/dist/DeckMapSurface.d.ts +1 -1
  24. package/dist/DeckMapSurface.js +1 -1
  25. package/dist/DeckMapSurface.js.map +1 -1
  26. package/dist/DeckMapsSlice.d.ts +5 -0
  27. package/dist/DeckMapsSlice.d.ts.map +1 -1
  28. package/dist/DeckMapsSlice.js +6 -3
  29. package/dist/DeckMapsSlice.js.map +1 -1
  30. package/dist/MapSettings.d.ts +14 -0
  31. package/dist/MapSettings.d.ts.map +1 -1
  32. package/dist/MapSettings.js +548 -192
  33. package/dist/MapSettings.js.map +1 -1
  34. package/dist/MapSettingsControls.d.ts +8 -1
  35. package/dist/MapSettingsControls.d.ts.map +1 -1
  36. package/dist/MapSettingsControls.js +24 -2
  37. package/dist/MapSettingsControls.js.map +1 -1
  38. package/dist/ai.d.ts.map +1 -1
  39. package/dist/ai.js +20 -12
  40. package/dist/ai.js.map +1 -1
  41. package/dist/aiNormalize.d.ts.map +1 -1
  42. package/dist/aiNormalize.js +2 -1
  43. package/dist/aiNormalize.js.map +1 -1
  44. package/dist/basemap.d.ts +23 -0
  45. package/dist/basemap.d.ts.map +1 -0
  46. package/dist/basemap.js +23 -0
  47. package/dist/basemap.js.map +1 -0
  48. package/dist/block.d.ts +1 -1
  49. package/dist/block.d.ts.map +1 -1
  50. package/dist/block.js +13 -9
  51. package/dist/block.js.map +1 -1
  52. package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
  53. package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
  54. package/dist/createOrUpdateDeckMapResource.js +57 -4
  55. package/dist/createOrUpdateDeckMapResource.js.map +1 -1
  56. package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
  57. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
  58. package/dist/datasets/PreparedDatasetStore.js +4 -8
  59. package/dist/datasets/PreparedDatasetStore.js.map +1 -1
  60. package/dist/datasets/helpers.d.ts +39 -2
  61. package/dist/datasets/helpers.d.ts.map +1 -1
  62. package/dist/datasets/helpers.js +86 -3
  63. package/dist/datasets/helpers.js.map +1 -1
  64. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
  65. package/dist/datasets/usePreparedDatasetStates.js +12 -8
  66. package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
  67. package/dist/index.d.ts +6 -3
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +5 -2
  70. package/dist/index.js.map +1 -1
  71. package/dist/json/colorScaleFunction.d.ts +12 -4
  72. package/dist/json/colorScaleFunction.d.ts.map +1 -1
  73. package/dist/json/colorScaleFunction.js.map +1 -1
  74. package/dist/json/compileColorScale.d.ts +3 -2
  75. package/dist/json/compileColorScale.d.ts.map +1 -1
  76. package/dist/json/compileColorScale.js +16 -1
  77. package/dist/json/compileColorScale.js.map +1 -1
  78. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
  79. package/dist/json/createDeckJsonConfiguration.js +235 -175
  80. package/dist/json/createDeckJsonConfiguration.js.map +1 -1
  81. package/dist/json/defaultClasses.d.ts.map +1 -1
  82. package/dist/json/defaultClasses.js +3 -3
  83. package/dist/json/defaultClasses.js.map +1 -1
  84. package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
  85. package/dist/json/extractColorScaleLegends.js +41 -26
  86. package/dist/json/extractColorScaleLegends.js.map +1 -1
  87. package/dist/json/heatmapDefaults.d.ts +17 -7
  88. package/dist/json/heatmapDefaults.d.ts.map +1 -1
  89. package/dist/json/heatmapDefaults.js +54 -12
  90. package/dist/json/heatmapDefaults.js.map +1 -1
  91. package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
  92. package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
  93. package/dist/json/layers/DeckHeatmapLayer.js +69 -0
  94. package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
  95. package/dist/json/layers/index.d.ts +1 -0
  96. package/dist/json/layers/index.d.ts.map +1 -1
  97. package/dist/json/layers/index.js +1 -0
  98. package/dist/json/layers/index.js.map +1 -1
  99. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
  100. package/dist/json/rewriteGeoArrowAccessors.js +13 -5
  101. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
  102. package/dist/json/scaleFunction.d.ts +5 -8
  103. package/dist/json/scaleFunction.d.ts.map +1 -1
  104. package/dist/json/scaleFunction.js +30 -5
  105. package/dist/json/scaleFunction.js.map +1 -1
  106. package/dist/mapAiConfig.d.ts +6 -0
  107. package/dist/mapAiConfig.d.ts.map +1 -1
  108. package/dist/mapAiConfig.js +7 -0
  109. package/dist/mapAiConfig.js.map +1 -1
  110. package/dist/mapAiSharedInstructions.d.ts +1 -1
  111. package/dist/mapAiSharedInstructions.d.ts.map +1 -1
  112. package/dist/mapAiSharedInstructions.js +4 -3
  113. package/dist/mapAiSharedInstructions.js.map +1 -1
  114. package/dist/mapConfig.d.ts +6 -1
  115. package/dist/mapConfig.d.ts.map +1 -1
  116. package/dist/mapConfig.js +28 -3
  117. package/dist/mapConfig.js.map +1 -1
  118. package/dist/mapConfigUtils.d.ts +22 -0
  119. package/dist/mapConfigUtils.d.ts.map +1 -1
  120. package/dist/mapConfigUtils.js +152 -5
  121. package/dist/mapConfigUtils.js.map +1 -1
  122. package/dist/mapLayerConfigUtils.d.ts +55 -0
  123. package/dist/mapLayerConfigUtils.d.ts.map +1 -1
  124. package/dist/mapLayerConfigUtils.js +222 -11
  125. package/dist/mapLayerConfigUtils.js.map +1 -1
  126. package/dist/mapResourceAuthoring.d.ts +1 -1
  127. package/dist/mapResourceAuthoring.d.ts.map +1 -1
  128. package/dist/mapResourceAuthoring.js +14 -7
  129. package/dist/mapResourceAuthoring.js.map +1 -1
  130. package/dist/mapStyles.d.ts +16 -0
  131. package/dist/mapStyles.d.ts.map +1 -0
  132. package/dist/mapStyles.js +32 -0
  133. package/dist/mapStyles.js.map +1 -0
  134. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
  135. package/dist/prepare/prepareDeckDataset.js +1 -0
  136. package/dist/prepare/prepareDeckDataset.js.map +1 -1
  137. package/dist/prepare/types.d.ts +3 -0
  138. package/dist/prepare/types.d.ts.map +1 -1
  139. package/dist/prepare/types.js.map +1 -1
  140. package/dist/prepare/wkbDecoder.d.ts.map +1 -1
  141. package/dist/prepare/wkbDecoder.js +62 -16
  142. package/dist/prepare/wkbDecoder.js.map +1 -1
  143. package/dist/prepare/wkbParser.d.ts +2 -0
  144. package/dist/prepare/wkbParser.d.ts.map +1 -1
  145. package/dist/prepare/wkbParser.js +1 -0
  146. package/dist/prepare/wkbParser.js.map +1 -1
  147. package/dist/protomapsStyles.d.ts +18 -0
  148. package/dist/protomapsStyles.d.ts.map +1 -0
  149. package/dist/protomapsStyles.js +38 -0
  150. package/dist/protomapsStyles.js.map +1 -0
  151. package/dist/types.d.ts +13 -0
  152. package/dist/types.d.ts.map +1 -1
  153. package/dist/types.js.map +1 -1
  154. package/package.json +11 -9
@@ -1 +1 @@
1
- {"version":3,"file":"mapLayerConfigUtils.js","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ColorScaleConfig, ColorScaleScheme} from '@sqlrooms/color-scales';\nimport type {DeckMapConfig} from './mapConfig';\nimport type {DeckAutoLayerType} from './types';\nimport {isColorScaleFunction} from './json/layerConfig';\n\nexport type DeckMapLayerRecord = Record<string, unknown>;\n\nexport type DeckMapLayerColorScaleFunction = ColorScaleConfig & {\n '@@function': 'colorScale';\n};\n\nexport type DeckMapLayerColorAccessor =\n | 'getFillColor'\n | 'getLineColor'\n | 'getColor'\n | 'getSourceColor'\n | 'getTargetColor';\n\nexport const DECK_MAP_LAYER_TYPE_OPTIONS: ReadonlyArray<{\n value: DeckAutoLayerType;\n label: string;\n}> = [\n {value: 'GeoArrowScatterplotLayer', label: 'Point'},\n {value: 'GeoArrowHeatmapLayer', label: 'Heatmap'},\n {value: 'GeoArrowColumnLayer', label: 'Column'},\n {value: 'GeoArrowPathLayer', label: 'Path'},\n {value: 'GeoArrowPolygonLayer', label: 'Polygon'},\n {value: 'GeoArrowSolidPolygonLayer', label: 'Solid polygon'},\n {value: 'GeoArrowArcLayer', label: 'Arc'},\n {value: 'GeoArrowTripsLayer', label: 'Trips'},\n {value: 'GeoArrowH3HexagonLayer', label: 'H3 hexagon'},\n {value: 'GeoJsonLayer', label: 'GeoJSON'},\n];\n\nexport const DECK_MAP_COLOR_ACCESSOR_OPTIONS: ReadonlyArray<{\n value: DeckMapLayerColorAccessor;\n label: string;\n}> = [\n {value: 'getFillColor', label: 'Fill color'},\n {value: 'getLineColor', label: 'Line color'},\n {value: 'getColor', label: 'Color'},\n {value: 'getSourceColor', label: 'Source color'},\n {value: 'getTargetColor', label: 'Target color'},\n];\n\nexport const DECK_MAP_COLOR_SCALE_TYPE_OPTIONS: ReadonlyArray<{\n value: ColorScaleConfig['type'];\n label: string;\n defaultScheme: ColorScaleScheme;\n}> = [\n {value: 'sequential', label: 'Sequential', defaultScheme: 'Viridis'},\n {value: 'diverging', label: 'Diverging', defaultScheme: 'RdBu'},\n {value: 'quantize', label: 'Quantize', defaultScheme: 'YlOrRd'},\n {value: 'quantile', label: 'Quantile', defaultScheme: 'YlOrRd'},\n {value: 'categorical', label: 'Categorical', defaultScheme: 'Tableau10'},\n];\n\nconst GEOMETRY_COLUMN_LAYER_TYPES = new Set([\n 'geoarrowpolygonlayer',\n 'geoarrowsolidpolygonlayer',\n 'geoarrowpathlayer',\n 'geoarrowtripslayer',\n 'geojsonlayer',\n 'polygonlayer',\n 'solidpolygonlayer',\n 'geojson',\n 'polygon',\n 'solid polygon',\n]);\n\nconst H3_LAYER_TYPES = new Set(['geoarrowh3hexagonlayer', 'h3hexagonlayer']);\n\nconst ARC_LAYER_TYPES = new Set(['geoarrowarclayer', 'arclayer']);\n\nconst TRIPS_LAYER_TYPES = new Set([\n 'geoarrowtripslayer',\n 'decktripslayer',\n 'tripslayer',\n]);\n\nconst RADIUS_LAYER_TYPES = new Set([\n 'geoarrowscatterplotlayer',\n 'scatterplotlayer',\n 'geojsonlayer',\n]);\n\nconst COLUMN_RADIUS_LAYER_TYPES = new Set([\n 'geoarrowcolumnlayer',\n 'columnlayer',\n]);\n\n// GeoJSON: elevation/scale compile is geoarrow-only — no extrusion UI here.\nconst EXTRUDABLE_LAYER_TYPES = new Set([\n 'geoarrowh3hexagonlayer',\n 'h3hexagonlayer',\n 'geoarrowcolumnlayer',\n 'columnlayer',\n 'geoarrowpolygonlayer',\n 'polygonlayer',\n 'geoarrowsolidpolygonlayer',\n 'solidpolygonlayer',\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction getObjectSpec(\n config: DeckMapConfig,\n): Record<string, unknown> | undefined {\n return isRecord(config.spec) ? config.spec : undefined;\n}\n\nexport function getDeckMapLayerRecords(\n config: DeckMapConfig,\n): DeckMapLayerRecord[] {\n const layers = getObjectSpec(config)?.layers;\n return Array.isArray(layers) ? layers.filter(isRecord) : [];\n}\n\nexport function getDeckMapLayerDatasetId(\n layer: DeckMapLayerRecord | undefined,\n): string | undefined {\n const binding = layer?._sqlroomsBinding;\n if (!isRecord(binding)) return undefined;\n return typeof binding.dataset === 'string' ? binding.dataset : undefined;\n}\n\nexport function usesGeometryColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n GEOMETRY_COLUMN_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesH3ColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' && H3_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesArcColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n ARC_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesRadiusSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n RADIUS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesColumnRadiusSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n COLUMN_RADIUS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesTripsSettings(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n TRIPS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesExtrusionSettings(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n EXTRUDABLE_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function getDeckMapColorAccessorOptions(\n layerType: unknown,\n): typeof DECK_MAP_COLOR_ACCESSOR_OPTIONS {\n if (layerType === 'GeoArrowPathLayer' || layerType === 'GeoArrowTripsLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) => option.value === 'getColor',\n );\n }\n\n if (layerType === 'GeoArrowArcLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) =>\n option.value === 'getSourceColor' || option.value === 'getTargetColor',\n );\n }\n\n if (layerType === 'GeoArrowHeatmapLayer') {\n return [];\n }\n\n if (layerType === 'GeoArrowColumnLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) => option.value === 'getFillColor',\n );\n }\n\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) =>\n option.value === 'getFillColor' || option.value === 'getLineColor',\n );\n}\n\nexport function updateDeckMapLayer(\n config: DeckMapConfig,\n layerIndex: number,\n updater: (layer: DeckMapLayerRecord) => DeckMapLayerRecord,\n): DeckMapConfig {\n const spec = getObjectSpec(config);\n if (!spec || !Array.isArray(spec.layers)) {\n return config;\n }\n\n const layer = spec.layers[layerIndex];\n if (!isRecord(layer)) {\n return config;\n }\n\n return {\n ...config,\n spec: {\n ...spec,\n layers: spec.layers.map((candidate, index) =>\n index === layerIndex ? updater({...layer}) : candidate,\n ),\n },\n };\n}\n\nexport function setDeckMapLayerType(\n config: DeckMapConfig,\n layerIndex: number,\n layerType: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => {\n const nextLayer: DeckMapLayerRecord = {\n ...layer,\n '@@type': layerType,\n };\n const lt = layerType.toLowerCase();\n if (\n lt === 'geoarrowcolumnlayer' ||\n lt === 'columnlayer' ||\n lt === 'deckcolumnlayer'\n ) {\n const radius =\n typeof nextLayer.radius === 'number' &&\n Number.isFinite(nextLayer.radius) &&\n nextLayer.radius > 0\n ? nextLayer.radius\n : 50;\n const withRadius = applyDeckMapColumnRadiusMeters(nextLayer, radius);\n if (typeof withRadius.elevationScale !== 'number') {\n withRadius.elevationScale = 1;\n }\n return withRadius;\n }\n return nextLayer;\n });\n}\n\n// Point/heatmap radius leftovers (`getRadius`, pixel units) break ColumnLayer meters UI.\nconst COLUMN_LAYER_RADIUS_CONFLICT_KEYS = [\n 'getRadius',\n 'radiusMinPixels',\n 'radiusMaxPixels',\n 'radiusPixels',\n] as const;\n\n/** Force meters and strip point/heatmap radius leftovers (does not set `radius`). */\nexport function stripDeckMapColumnLayerRadiusConflicts(\n layer: DeckMapLayerRecord,\n): DeckMapLayerRecord {\n const next: DeckMapLayerRecord = {\n ...layer,\n radiusUnits: 'meters',\n };\n for (const key of COLUMN_LAYER_RADIUS_CONFLICT_KEYS) {\n delete next[key];\n }\n return next;\n}\n\n/** True when ColumnLayer still carries point/heatmap radius props or pixel units. */\nexport function deckMapColumnLayerHasRadiusConflicts(\n layer: DeckMapLayerRecord,\n): boolean {\n if (layer.radiusUnits === 'pixels') return true;\n return COLUMN_LAYER_RADIUS_CONFLICT_KEYS.some(\n (key) => layer[key] !== undefined,\n );\n}\n\n/** Apply a column radius in meters and strip conflicting point/heatmap radius props. */\nexport function applyDeckMapColumnRadiusMeters(\n layer: DeckMapLayerRecord,\n radiusMeters: number,\n): DeckMapLayerRecord {\n return {\n ...stripDeckMapColumnLayerRadiusConflicts(layer),\n radius: radiusMeters,\n radiusUnits: 'meters',\n };\n}\n\n/** Set GeoArrowColumnLayer disk radius in meters. */\nexport function setDeckMapLayerColumnRadius(\n config: DeckMapConfig,\n layerIndex: number,\n radiusMeters: number,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) =>\n applyDeckMapColumnRadiusMeters(layer, radiusMeters),\n );\n}\n\nexport function setDeckMapLayerGeometryColumn(\n config: DeckMapConfig,\n layerIndex: number,\n geometryColumn: string,\n): DeckMapConfig {\n const layer = getDeckMapLayerRecords(config)[layerIndex];\n const datasetId = getDeckMapLayerDatasetId(layer);\n if (!datasetId || !config.datasets?.[datasetId]) {\n return config;\n }\n\n const updatedConfig = {\n ...config,\n datasets: {\n ...config.datasets,\n [datasetId]: {\n ...config.datasets[datasetId],\n geometryColumn,\n },\n },\n fitToData:\n config.fitToData &&\n config.fitToData.dataset === datasetId &&\n 'geometryColumn' in config.fitToData\n ? {\n ...config.fitToData,\n geometryColumn,\n }\n : config.fitToData,\n };\n\n return updateDeckMapLayer(updatedConfig, layerIndex, (l) => ({\n ...l,\n _sqlroomsBinding: {\n ...(l._sqlroomsBinding as Record<string, unknown>),\n geometryColumn,\n },\n }));\n}\n\nexport function setDeckMapLayerHexagonColumn(\n config: DeckMapConfig,\n layerIndex: number,\n hexagonColumn: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n getHexagon: `@@=${hexagonColumn}`,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n hexagonColumn,\n },\n }));\n}\n\nexport function setDeckMapLayerArcColumns(\n config: DeckMapConfig,\n layerIndex: number,\n columns: {\n sourceGeometryColumn?: string;\n targetGeometryColumn?: string;\n sourceLatitudeColumn?: string;\n sourceLongitudeColumn?: string;\n targetLatitudeColumn?: string;\n targetLongitudeColumn?: string;\n },\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n ...columns,\n },\n }));\n}\n\nexport function setDeckMapLayerTimestampColumn(\n config: DeckMapConfig,\n layerIndex: number,\n timestampColumn: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n timestampColumn,\n },\n }));\n}\n\nexport function getDeckMapLayerColorScale(\n layer: DeckMapLayerRecord | undefined,\n accessor: DeckMapLayerColorAccessor,\n): DeckMapLayerColorScaleFunction | undefined {\n const value = layer?.[accessor];\n return isColorScaleFunction(value)\n ? (value as DeckMapLayerColorScaleFunction)\n : undefined;\n}\n\nexport function setDeckMapLayerColorScale(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n colorScale: DeckMapLayerColorScaleFunction,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n [accessor]: colorScale,\n }));\n}\n\nconst DEFAULT_LAYER_FILL_COLOR: [number, number, number, number] = [\n 56, 189, 248, 180,\n];\n\nconst DEFAULT_LAYER_STROKE_COLOR: [number, number, number, number] = [\n 0, 0, 0, 255,\n];\n\nexport function clearDeckMapLayerColorScale(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n): DeckMapConfig {\n const defaultColor =\n accessor === 'getLineColor'\n ? DEFAULT_LAYER_STROKE_COLOR\n : DEFAULT_LAYER_FILL_COLOR;\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n // Missing fill → deck.gl opaque black; keep an explicit flat color.\n [accessor]: [...defaultColor],\n }));\n}\n\nexport function createDeckMapLayerColorScale(options: {\n field: string;\n type?: ColorScaleConfig['type'];\n scheme?: ColorScaleScheme;\n title?: string;\n}): DeckMapLayerColorScaleFunction {\n const type = options.type ?? 'sequential';\n const scheme =\n options.scheme ??\n DECK_MAP_COLOR_SCALE_TYPE_OPTIONS.find((option) => option.value === type)\n ?.defaultScheme ??\n 'Viridis';\n const base = {\n '@@function': 'colorScale' as const,\n field: options.field,\n legend: {title: options.title ?? options.field},\n };\n\n if (type === 'categorical') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'categorical'}\n >['scheme'],\n };\n }\n\n if (type === 'diverging') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'diverging'}\n >['scheme'],\n domain: 'auto',\n };\n }\n\n if (type === 'quantize') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<ColorScaleConfig, {type: 'quantize'}>['scheme'],\n domain: 'auto',\n };\n }\n\n if (type === 'quantile') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<ColorScaleConfig, {type: 'quantile'}>['scheme'],\n };\n }\n\n if (type === 'threshold') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'threshold'}\n >['scheme'],\n thresholds: [],\n };\n }\n\n return {\n ...base,\n type: 'sequential',\n scheme: scheme as Extract<ColorScaleConfig, {type: 'sequential'}>['scheme'],\n domain: 'auto',\n };\n}\n"]}
1
+ {"version":3,"file":"mapLayerConfigUtils.js","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ColorScaleConfig, ColorScaleScheme} from '@sqlrooms/color-scales';\nimport type {DeckMapConfig} from './mapConfig';\nimport type {DeckAutoLayerType} from './types';\nimport {DEFAULT_HEATMAP_COLOR_RANGE} from './json/heatmapDefaults';\nimport {isColorScaleFunction} from './json/layerConfig';\n\nexport type DeckMapLayerRecord = Record<string, unknown>;\n\nexport type DeckMapLayerColorScaleFunction = ColorScaleConfig & {\n '@@function': 'colorScale';\n /**\n * Per-accessor opacity (0–1). Preferred over layer-level `opacity` so fill and\n * stroke (or arc endpoints) can be dimmed independently.\n */\n opacity?: number;\n};\n\nexport type DeckMapLayerColorAccessor =\n | 'getFillColor'\n | 'getLineColor'\n | 'getColor'\n | 'getSourceColor'\n | 'getTargetColor';\n\nexport const DECK_MAP_LAYER_TYPE_OPTIONS: ReadonlyArray<{\n value: DeckAutoLayerType;\n label: string;\n}> = [\n {value: 'GeoArrowScatterplotLayer', label: 'Point'},\n {value: 'GeoArrowHeatmapLayer', label: 'Heatmap'},\n {value: 'GeoArrowColumnLayer', label: 'Column'},\n {value: 'GeoArrowPathLayer', label: 'Path'},\n {value: 'GeoArrowPolygonLayer', label: 'Polygon'},\n {value: 'GeoArrowArcLayer', label: 'Arc'},\n {value: 'GeoArrowTripsLayer', label: 'Trips'},\n {value: 'GeoArrowH3HexagonLayer', label: 'H3 hexagon'},\n {value: 'GeoJsonLayer', label: 'GeoJSON'},\n];\n\nexport const DECK_MAP_COLOR_ACCESSOR_OPTIONS: ReadonlyArray<{\n value: DeckMapLayerColorAccessor;\n label: string;\n}> = [\n {value: 'getFillColor', label: 'Fill color'},\n {value: 'getLineColor', label: 'Line color'},\n {value: 'getColor', label: 'Color'},\n {value: 'getSourceColor', label: 'Source color'},\n {value: 'getTargetColor', label: 'Target color'},\n];\n\nexport const DECK_MAP_COLOR_SCALE_TYPE_OPTIONS: ReadonlyArray<{\n value: ColorScaleConfig['type'];\n label: string;\n defaultScheme: ColorScaleScheme;\n}> = [\n {value: 'sequential', label: 'Sequential', defaultScheme: 'Viridis'},\n {value: 'diverging', label: 'Diverging', defaultScheme: 'RdBu'},\n {value: 'quantize', label: 'Quantize', defaultScheme: 'YlOrRd'},\n {value: 'quantile', label: 'Quantile', defaultScheme: 'YlOrRd'},\n {value: 'categorical', label: 'Categorical', defaultScheme: 'Tableau10'},\n];\n\nconst GEOMETRY_COLUMN_LAYER_TYPES = new Set([\n 'geoarrowpolygonlayer',\n 'geoarrowsolidpolygonlayer',\n 'geoarrowpathlayer',\n 'geoarrowtripslayer',\n 'geojsonlayer',\n 'polygonlayer',\n 'solidpolygonlayer',\n 'geojson',\n 'polygon',\n 'solid polygon',\n]);\n\nconst H3_LAYER_TYPES = new Set(['geoarrowh3hexagonlayer', 'h3hexagonlayer']);\n\nconst ARC_LAYER_TYPES = new Set(['geoarrowarclayer', 'arclayer']);\n\nconst TRIPS_LAYER_TYPES = new Set([\n 'geoarrowtripslayer',\n 'decktripslayer',\n 'tripslayer',\n]);\n\nconst RADIUS_LAYER_TYPES = new Set([\n 'geoarrowscatterplotlayer',\n 'scatterplotlayer',\n 'geojsonlayer',\n]);\n\nconst COLUMN_RADIUS_LAYER_TYPES = new Set([\n 'geoarrowcolumnlayer',\n 'columnlayer',\n]);\n\nconst EXTRUDABLE_LAYER_TYPES = new Set([\n 'geoarrowh3hexagonlayer',\n 'h3hexagonlayer',\n 'geoarrowcolumnlayer',\n 'columnlayer',\n 'geoarrowpolygonlayer',\n 'polygonlayer',\n 'geoarrowsolidpolygonlayer',\n 'solidpolygonlayer',\n 'geojsonlayer',\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction getObjectSpec(\n config: DeckMapConfig,\n): Record<string, unknown> | undefined {\n return isRecord(config.spec) ? config.spec : undefined;\n}\n\nexport function getDeckMapLayerRecords(\n config: DeckMapConfig,\n): DeckMapLayerRecord[] {\n const layers = getObjectSpec(config)?.layers;\n return Array.isArray(layers) ? layers.filter(isRecord) : [];\n}\n\nexport function getDeckMapLayerDatasetId(\n layer: DeckMapLayerRecord | undefined,\n): string | undefined {\n const binding = layer?._sqlroomsBinding;\n if (!isRecord(binding)) return undefined;\n return typeof binding.dataset === 'string' ? binding.dataset : undefined;\n}\n\nexport function usesGeometryColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n GEOMETRY_COLUMN_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesH3ColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' && H3_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesArcColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n ARC_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesRadiusSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n RADIUS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesColumnRadiusSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n COLUMN_RADIUS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesTripsSettings(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n TRIPS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesExtrusionSettings(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n EXTRUDABLE_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nconst STROKE_LAYER_TYPES = new Set([\n 'geoarrowscatterplotlayer',\n 'scatterplotlayer',\n 'geoarrowh3hexagonlayer',\n 'h3hexagonlayer',\n 'geoarrowpolygonlayer',\n 'polygonlayer',\n // SolidPolygon: no stroked outlines (wireframe only).\n 'geojsonlayer',\n]);\n\nexport function usesStrokeSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n STROKE_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\n/** Polygon, GeoJSON, and H3 do not draw strokes while extruded. */\nexport function usesStrokeExtrusionWarning(layerType: unknown) {\n if (typeof layerType !== 'string') return false;\n const type = layerType.toLowerCase();\n return (\n type === 'geojsonlayer' ||\n type === 'geoarrowpolygonlayer' ||\n type === 'polygonlayer' ||\n H3_LAYER_TYPES.has(type)\n );\n}\n\n/** True for GeoArrow / deck H3 hexagon layer class names. */\nexport function isDeckMapH3HexagonLayer(layerType: unknown): boolean {\n return (\n typeof layerType === 'string' && H3_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\n/** Effective `extruded`; H3 and Column default to true when omitted. */\nexport function getDeckMapLayerExtruded(\n layer: DeckMapLayerRecord | undefined,\n): boolean {\n if (typeof layer?.extruded === 'boolean') return layer.extruded;\n const layerType = layer?.['@@type'];\n return (\n isDeckMapH3HexagonLayer(layerType) || usesColumnRadiusSetting(layerType)\n );\n}\n\n/** Default `stroked` when omitted. H3 strokes only when not extruded. */\nexport function getDeckMapLayerStrokeDefault(\n layerType: unknown,\n options?: {extruded?: boolean},\n): boolean {\n if (typeof layerType !== 'string') return false;\n const type = layerType.toLowerCase();\n if (\n type.includes('scatterplot') ||\n type.includes('solidpolygon') ||\n type === 'solid polygon'\n ) {\n return false;\n }\n if (isDeckMapH3HexagonLayer(layerType)) {\n const extruded = options?.extruded ?? true;\n return !extruded;\n }\n return true;\n}\n\nfunction deckMapLayerHasActiveStroke(layer: DeckMapLayerRecord): boolean {\n if (typeof layer.stroked === 'boolean') return layer.stroked;\n return getDeckMapLayerStrokeDefault(layer['@@type'], {\n extruded: getDeckMapLayerExtruded(layer),\n });\n}\n\n/** Bake `layer.opacity` into flat alphas / colorScale.opacity, then drop it. */\nexport function detachDeckMapLayerOpacity(\n layer: DeckMapLayerRecord,\n): DeckMapLayerRecord {\n const opacity = layer.opacity;\n if (typeof opacity !== 'number' || !Number.isFinite(opacity)) {\n return layer;\n }\n const factor = Math.max(0, Math.min(1, opacity));\n const next: DeckMapLayerRecord = {...layer};\n const accessors = getDeckMapColorAccessorOptions(next['@@type']);\n // Implicit Deck defaults are still dimmed by layer.opacity — materialize\n // them so dropping opacity does not leave a sibling channel fully opaque.\n const implicitColor: [number, number, number, number] = [0, 0, 0, 255];\n if (\n accessors.some((option) => option.value === 'getFillColor') &&\n next.getFillColor === undefined &&\n next.filled !== false\n ) {\n next.getFillColor = [...implicitColor];\n }\n if (\n accessors.some((option) => option.value === 'getLineColor') &&\n next.getLineColor === undefined &&\n deckMapLayerHasActiveStroke(next)\n ) {\n next.getLineColor = [...implicitColor];\n }\n for (const {value} of DECK_MAP_COLOR_ACCESSOR_OPTIONS) {\n const color = next[value];\n if (isDeckMapLayerFlatRgbaColor(color)) {\n const channelAlpha = color[3] ?? 255;\n next[value] = [\n color[0]!,\n color[1]!,\n color[2]!,\n Math.round(Math.max(0, Math.min(255, channelAlpha * factor))),\n ];\n continue;\n }\n const scale = getDeckMapLayerColorScale(next, value);\n if (scale) {\n next[value] = {\n ...scale,\n opacity: getDeckMapColorScaleOpacity(scale) * factor,\n };\n }\n }\n const {opacity: _droppedOpacity, ...rest} = next;\n void _droppedOpacity;\n return rest;\n}\n\n/** Opacity 0–1 on a color-scale accessor (default 1). */\nexport function getDeckMapColorScaleOpacity(\n colorScale: DeckMapLayerColorScaleFunction | undefined,\n): number {\n const opacity = colorScale?.opacity;\n if (typeof opacity === 'number' && Number.isFinite(opacity)) {\n return Math.max(0, Math.min(1, opacity));\n }\n return 1;\n}\n\n/** Layer-level opacity factor 0–1 (1 when omitted). */\nexport function getDeckMapLayerOpacityFactor(\n layer: DeckMapLayerRecord | undefined,\n): number {\n const opacity = layer?.opacity;\n if (typeof opacity === 'number' && Number.isFinite(opacity)) {\n return Math.max(0, Math.min(1, opacity));\n }\n return 1;\n}\n\n/**\n * Effective 0–100 opacity for a color accessor, including legacy `layer.opacity`.\n * Matches the value the Appearance slider should show before detaching.\n */\nexport function getDeckMapLayerChannelOpacityPercent(\n layer: DeckMapLayerRecord | undefined,\n accessor: DeckMapLayerColorAccessor,\n fallbackFlatAlpha = 255,\n): number {\n const factor = getDeckMapLayerOpacityFactor(layer);\n const scale = getDeckMapLayerColorScale(layer, accessor);\n if (scale) {\n return Math.round(getDeckMapColorScaleOpacity(scale) * factor * 100);\n }\n const flat = getDeckMapLayerFlatColor(layer, accessor);\n const alpha = flat?.[3] ?? fallbackFlatAlpha;\n return Math.round((Math.max(0, Math.min(255, alpha * factor)) / 255) * 100);\n}\n\nfunction flatColorWithScaleOpacity(\n color: readonly [number, number, number, number],\n scale: DeckMapLayerColorScaleFunction | undefined,\n): [number, number, number, number] {\n const opacity = getDeckMapColorScaleOpacity(scale);\n const hasExplicitOpacity =\n typeof scale?.opacity === 'number' && Number.isFinite(scale.opacity);\n const alpha = hasExplicitOpacity\n ? Math.round(Math.max(0, Math.min(255, opacity * 255)))\n : (color[3] ?? 255);\n return [color[0], color[1], color[2], alpha];\n}\n\n/** Replace a color scale with flat RGBA (bakes scale opacity into alpha). */\nexport function replaceDeckMapLayerColorScaleWithFlat(\n layer: DeckMapLayerRecord,\n accessor: DeckMapLayerColorAccessor,\n flatColor: readonly [number, number, number, number],\n): DeckMapLayerRecord {\n const scale = getDeckMapLayerColorScale(layer, accessor);\n return detachDeckMapLayerOpacity({\n ...layer,\n [accessor]: flatColorWithScaleOpacity(flatColor, scale),\n });\n}\n\n/** Replace multiple color scales with flat RGBA (e.g. arc source+target). */\nexport function replaceDeckMapLayerColorScalesWithFlat(\n layer: DeckMapLayerRecord,\n replacements: Partial<\n Record<DeckMapLayerColorAccessor, readonly [number, number, number, number]>\n >,\n): DeckMapLayerRecord {\n const next: DeckMapLayerRecord = {...layer};\n for (const accessor of Object.keys(\n replacements,\n ) as DeckMapLayerColorAccessor[]) {\n const color = replacements[accessor];\n if (!color) continue;\n const scale = getDeckMapLayerColorScale(layer, accessor);\n next[accessor] = flatColorWithScaleOpacity(color, scale);\n }\n return detachDeckMapLayerOpacity(next);\n}\n\nexport function getDeckMapColorAccessorOptions(\n layerType: unknown,\n): typeof DECK_MAP_COLOR_ACCESSOR_OPTIONS {\n if (layerType === 'GeoArrowPathLayer' || layerType === 'GeoArrowTripsLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) => option.value === 'getColor',\n );\n }\n\n if (layerType === 'GeoArrowArcLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) =>\n option.value === 'getSourceColor' || option.value === 'getTargetColor',\n );\n }\n\n if (layerType === 'GeoArrowHeatmapLayer') {\n return [];\n }\n\n if (layerType === 'GeoArrowColumnLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) => option.value === 'getFillColor',\n );\n }\n\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) =>\n option.value === 'getFillColor' || option.value === 'getLineColor',\n );\n}\n\nexport function updateDeckMapLayer(\n config: DeckMapConfig,\n layerIndex: number,\n updater: (layer: DeckMapLayerRecord) => DeckMapLayerRecord,\n): DeckMapConfig {\n const spec = getObjectSpec(config);\n if (!spec || !Array.isArray(spec.layers)) {\n return config;\n }\n\n const layer = spec.layers[layerIndex];\n if (!isRecord(layer)) {\n return config;\n }\n\n return {\n ...config,\n spec: {\n ...spec,\n layers: spec.layers.map((candidate, index) =>\n index === layerIndex ? updater({...layer}) : candidate,\n ),\n },\n };\n}\n\nexport function setDeckMapLayerType(\n config: DeckMapConfig,\n layerIndex: number,\n layerType: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => {\n const nextLayer: DeckMapLayerRecord = {\n ...layer,\n '@@type': layerType,\n };\n const lt = layerType.toLowerCase();\n if (lt === 'geoarrowheatmaplayer') {\n if (\n !Array.isArray(nextLayer.colorRange) ||\n nextLayer.colorRange.length === 0\n ) {\n nextLayer.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;\n }\n return nextLayer;\n }\n\n const colorAccessors = getDeckMapColorAccessorOptions(layerType);\n if (\n colorAccessors.some((option) => option.value === 'getFillColor') &&\n nextLayer.getFillColor === undefined &&\n nextLayer.filled !== false\n ) {\n nextLayer.getFillColor = [...DECK_MAP_DEFAULT_LAYER_COLOR];\n }\n if (lt === 'geoarrowcolumnlayer') {\n const radius =\n typeof nextLayer.radius === 'number' &&\n Number.isFinite(nextLayer.radius) &&\n nextLayer.radius > 0\n ? nextLayer.radius\n : 50;\n const withRadius = applyDeckMapColumnRadiusMeters(nextLayer, radius);\n if (typeof withRadius.elevationScale !== 'number') {\n withRadius.elevationScale = 1;\n }\n return withRadius;\n }\n return nextLayer;\n });\n}\n\n// Point/heatmap radius leftovers (`getRadius`, pixel units) break ColumnLayer meters UI.\nconst COLUMN_LAYER_RADIUS_CONFLICT_KEYS = [\n 'getRadius',\n 'radiusMinPixels',\n 'radiusMaxPixels',\n 'radiusPixels',\n] as const;\n\n/** Force meters and strip point/heatmap radius leftovers (does not set `radius`). */\nexport function stripDeckMapColumnLayerRadiusConflicts(\n layer: DeckMapLayerRecord,\n): DeckMapLayerRecord {\n const next: DeckMapLayerRecord = {\n ...layer,\n radiusUnits: 'meters',\n };\n for (const key of COLUMN_LAYER_RADIUS_CONFLICT_KEYS) {\n delete next[key];\n }\n return next;\n}\n\n/** True when ColumnLayer still carries point/heatmap radius props or pixel units. */\nexport function deckMapColumnLayerHasRadiusConflicts(\n layer: DeckMapLayerRecord,\n): boolean {\n if (layer.radiusUnits === 'pixels') return true;\n return COLUMN_LAYER_RADIUS_CONFLICT_KEYS.some(\n (key) => layer[key] !== undefined,\n );\n}\n\n/** Apply a column radius in meters and strip conflicting point/heatmap radius props. */\nexport function applyDeckMapColumnRadiusMeters(\n layer: DeckMapLayerRecord,\n radiusMeters: number,\n): DeckMapLayerRecord {\n return {\n ...stripDeckMapColumnLayerRadiusConflicts(layer),\n radius: radiusMeters,\n radiusUnits: 'meters',\n };\n}\n\n/** Set GeoArrowColumnLayer disk radius in meters. */\nexport function setDeckMapLayerColumnRadius(\n config: DeckMapConfig,\n layerIndex: number,\n radiusMeters: number,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) =>\n applyDeckMapColumnRadiusMeters(layer, radiusMeters),\n );\n}\n\nexport function setDeckMapLayerGeometryColumn(\n config: DeckMapConfig,\n layerIndex: number,\n geometryColumn: string,\n): DeckMapConfig {\n const layer = getDeckMapLayerRecords(config)[layerIndex];\n const datasetId = getDeckMapLayerDatasetId(layer);\n if (!datasetId || !config.datasets?.[datasetId]) {\n return config;\n }\n\n const updatedConfig = {\n ...config,\n datasets: {\n ...config.datasets,\n [datasetId]: {\n ...config.datasets[datasetId],\n geometryColumn,\n },\n },\n fitToData:\n config.fitToData &&\n config.fitToData.dataset === datasetId &&\n 'geometryColumn' in config.fitToData\n ? {\n ...config.fitToData,\n geometryColumn,\n }\n : config.fitToData,\n };\n\n return updateDeckMapLayer(updatedConfig, layerIndex, (l) => ({\n ...l,\n _sqlroomsBinding: {\n ...(l._sqlroomsBinding as Record<string, unknown>),\n geometryColumn,\n },\n }));\n}\n\nexport function setDeckMapLayerHexagonColumn(\n config: DeckMapConfig,\n layerIndex: number,\n hexagonColumn: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n getHexagon: `@@=${hexagonColumn}`,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n hexagonColumn,\n },\n }));\n}\n\nexport function setDeckMapLayerArcColumns(\n config: DeckMapConfig,\n layerIndex: number,\n columns: {\n sourceGeometryColumn?: string;\n targetGeometryColumn?: string;\n sourceLatitudeColumn?: string;\n sourceLongitudeColumn?: string;\n targetLatitudeColumn?: string;\n targetLongitudeColumn?: string;\n },\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n ...columns,\n },\n }));\n}\n\nexport function setDeckMapLayerTimestampColumn(\n config: DeckMapConfig,\n layerIndex: number,\n timestampColumn: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n timestampColumn,\n },\n }));\n}\n\nexport function getDeckMapLayerColorScale(\n layer: DeckMapLayerRecord | undefined,\n accessor: DeckMapLayerColorAccessor,\n): DeckMapLayerColorScaleFunction | undefined {\n const value = layer?.[accessor];\n return isColorScaleFunction(value)\n ? (value as DeckMapLayerColorScaleFunction)\n : undefined;\n}\n\nexport function setDeckMapLayerColorScale(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n colorScale: DeckMapLayerColorScaleFunction,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n [accessor]: colorScale,\n }));\n}\n\nconst DEFAULT_LAYER_FILL_COLOR: [number, number, number, number] = [\n 56, 189, 248, 180,\n];\n\nconst DEFAULT_LAYER_STROKE_COLOR: [number, number, number, number] = [\n 0, 0, 0, 255,\n];\n\n/** Default flat fill RGBA. */\nexport const DECK_MAP_DEFAULT_LAYER_COLOR: readonly [\n number,\n number,\n number,\n number,\n] = DEFAULT_LAYER_FILL_COLOR;\n\n/** Default stroke RGBA. */\nexport const DECK_MAP_DEFAULT_STROKE_COLOR: readonly [\n number,\n number,\n number,\n number,\n] = DEFAULT_LAYER_STROKE_COLOR;\n\n/** True when `value` is a 3- or 4-channel numeric RGB(A) array. */\nexport function isDeckMapLayerFlatRgbaColor(\n value: unknown,\n): value is [number, number, number, number?] {\n return (\n Array.isArray(value) &&\n value.length >= 3 &&\n value.length <= 4 &&\n value.every(\n (channel) => typeof channel === 'number' && Number.isFinite(channel),\n )\n );\n}\n\n/** Flat RGBA for an accessor, or undefined if scaled/missing. */\nexport function getDeckMapLayerFlatColor(\n layer: DeckMapLayerRecord | undefined,\n accessor: DeckMapLayerColorAccessor,\n): [number, number, number, number] | undefined {\n const value = layer?.[accessor];\n if (!isDeckMapLayerFlatRgbaColor(value)) return undefined;\n return [value[0]!, value[1]!, value[2]!, value[3] ?? 255];\n}\n\n/** Set a color accessor to a constant RGB(A); alpha defaults to 255. */\nexport function setDeckMapLayerFlatColor(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n color: readonly [number, number, number, number?],\n): DeckMapConfig {\n const rgba: [number, number, number, number] = [\n color[0],\n color[1],\n color[2],\n color[3] ?? 255,\n ];\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n [accessor]: rgba,\n }));\n}\n\n/** RGBA → `#rrggbb` for `<input type=\"color\">`. */\nexport function deckMapRgbaToHex(\n color: readonly [number, number, number, number?],\n): string {\n const toHex = (channel: number) =>\n Math.max(0, Math.min(255, Math.round(channel)))\n .toString(16)\n .padStart(2, '0');\n return `#${toHex(color[0])}${toHex(color[1])}${toHex(color[2])}`;\n}\n\nexport function clearDeckMapLayerColorScale(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n): DeckMapConfig {\n const defaultColor =\n accessor === 'getLineColor'\n ? DECK_MAP_DEFAULT_STROKE_COLOR\n : DECK_MAP_DEFAULT_LAYER_COLOR;\n return updateDeckMapLayer(config, layerIndex, (layer) =>\n replaceDeckMapLayerColorScaleWithFlat(layer, accessor, defaultColor),\n );\n}\n\nexport function createDeckMapLayerColorScale(options: {\n field: string;\n type?: ColorScaleConfig['type'];\n scheme?: ColorScaleScheme;\n title?: string;\n /** Per-accessor opacity 0–1. */\n opacity?: number;\n}): DeckMapLayerColorScaleFunction {\n const type = options.type ?? 'sequential';\n const scheme =\n options.scheme ??\n DECK_MAP_COLOR_SCALE_TYPE_OPTIONS.find((option) => option.value === type)\n ?.defaultScheme ??\n 'Viridis';\n const opacity =\n typeof options.opacity === 'number' && Number.isFinite(options.opacity)\n ? Math.max(0, Math.min(1, options.opacity))\n : undefined;\n const base = {\n '@@function': 'colorScale' as const,\n field: options.field,\n legend: {title: options.title ?? options.field},\n ...(opacity !== undefined ? {opacity} : {}),\n };\n\n if (type === 'categorical') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'categorical'}\n >['scheme'],\n };\n }\n\n if (type === 'diverging') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'diverging'}\n >['scheme'],\n domain: 'auto',\n };\n }\n\n if (type === 'quantize') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<ColorScaleConfig, {type: 'quantize'}>['scheme'],\n domain: 'auto',\n };\n }\n\n if (type === 'quantile') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<ColorScaleConfig, {type: 'quantile'}>['scheme'],\n };\n }\n\n if (type === 'threshold') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'threshold'}\n >['scheme'],\n thresholds: [],\n };\n }\n\n return {\n ...base,\n type: 'sequential',\n scheme: scheme as Extract<ColorScaleConfig, {type: 'sequential'}>['scheme'],\n domain: 'auto',\n };\n}\n"]}
@@ -35,7 +35,7 @@ export declare function getDeckMapResourceConfigIssues(config: DeckMapConfig, op
35
35
  /** Rejects invalid durable map writes after sparse patches have been merged. */
36
36
  export declare function assertDeckMapResourceConfig(config: DeckMapConfig): void;
37
37
  /**
38
- * Returns the package-owned authoring contract for hosts with direct worksheet
38
+ * Returns the package-owned authoring contract for hosts with direct document
39
39
  * map capability. Host adapters opt into it; they do not maintain prompt copies.
40
40
  */
41
41
  export declare function getDeckMapResourceAiInstructions(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"mapResourceAuthoring.d.ts","sourceRoot":"","sources":["../src/mapResourceAuthoring.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,aAAa,EAAuB,MAAM,aAAa,CAAC;AAQrE,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sCAAsC,GAAG;IACnD,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,iCAAiC,GAAG;IAC9C,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,0EAA0E;AAC1E,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC;gBAElC,MAAM,EAAE,0BAA0B,EAAE;CASjD;AAOD,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,OAAO,GACd,MAAM,GAAG,SAAS,CAyDpB;AA8LD;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,cAAc,EAAE,aAAa,EAC7B,OAAO,GAAE,iCAAsC,GAC9C,aAAa,CAoBf;AA2DD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,sCAA2C,GACnD,0BAA0B,EAAE,CAya9B;AAED,gFAAgF;AAChF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGvE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,IAAI,MAAM,CAoBzD"}
1
+ {"version":3,"file":"mapResourceAuthoring.d.ts","sourceRoot":"","sources":["../src/mapResourceAuthoring.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,aAAa,EAAuB,MAAM,aAAa,CAAC;AASrE,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sCAAsC,GAAG;IACnD,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,iCAAiC,GAAG;IAC9C,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,0EAA0E;AAC1E,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC;gBAElC,MAAM,EAAE,0BAA0B,EAAE;CASjD;AAOD,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,OAAO,GACd,MAAM,GAAG,SAAS,CAyDpB;AA8LD;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,cAAc,EAAE,aAAa,EAC7B,OAAO,GAAE,iCAAsC,GAC9C,aAAa,CAoBf;AA8DD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,sCAA2C,GACnD,0BAA0B,EAAE,CA6a9B;AAED,gFAAgF;AAChF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGvE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,IAAI,MAAM,CAqBzD"}
@@ -3,6 +3,7 @@ import { DeckJsonMapSpec } from './DeckJsonMapSpec';
3
3
  import { isDeckMapSqlDatasetSource, isDeckMapTableDatasetSource, } from './mapConfig';
4
4
  import { hasSelectStarAsWkbCollision } from './selectStarAsWkbCollision';
5
5
  import { getDeckMapSharedAiContractRules } from './mapAiSharedInstructions';
6
+ import { DECK_MAP_LAYER_TYPE_OPTIONS } from './mapLayerConfigUtils';
6
7
  /** Error raised before an invalid map resource can be durably written. */
7
8
  export class DeckMapResourceConfigError extends Error {
8
9
  issues;
@@ -263,11 +264,11 @@ const DECK_MAP_LAYER_CLASS_ALIASES = {
263
264
  ColumnLayer: 'GeoArrowColumnLayer',
264
265
  PathLayer: 'GeoArrowPathLayer',
265
266
  PolygonLayer: 'GeoArrowPolygonLayer',
266
- SolidPolygonLayer: 'GeoArrowSolidPolygonLayer',
267
267
  ArcLayer: 'GeoArrowArcLayer',
268
268
  TripsLayer: 'GeoArrowTripsLayer',
269
269
  H3HexagonLayer: 'GeoArrowH3HexagonLayer',
270
270
  };
271
+ const DECK_MAP_SUPPORTED_LAYER_TYPES = new Set(DECK_MAP_LAYER_TYPE_OPTIONS.map((option) => option.value));
271
272
  const COLOR_SCALE_ACCESSOR_PROPS = [
272
273
  'getFillColor',
273
274
  'getLineColor',
@@ -359,6 +360,12 @@ export function getDeckMapResourceConfigIssues(config, options = {}) {
359
360
  message: `use "${aliased}" — plain "${layerType}" is not a registered Deck JSON layer class`,
360
361
  });
361
362
  }
363
+ else if (!DECK_MAP_SUPPORTED_LAYER_TYPES.has(layerType)) {
364
+ issues.push({
365
+ path: `spec.layers.${index}.@@type`,
366
+ message: `use a supported Deck map layer type (${[...DECK_MAP_SUPPORTED_LAYER_TYPES].join(', ')}) — "${layerType}" is not allowed`,
367
+ });
368
+ }
362
369
  }
363
370
  for (const prop of COLOR_SCALE_ACCESSOR_PROPS) {
364
371
  const value = layer[prop];
@@ -471,7 +478,6 @@ export function getDeckMapResourceConfigIssues(config, options = {}) {
471
478
  }
472
479
  const ELEVATION_LAYER_TYPES = new Set([
473
480
  'GeoArrowPolygonLayer',
474
- 'GeoArrowSolidPolygonLayer',
475
481
  'GeoArrowColumnLayer',
476
482
  'GeoArrowH3HexagonLayer',
477
483
  ]);
@@ -625,17 +631,18 @@ export function assertDeckMapResourceConfig(config) {
625
631
  throw new DeckMapResourceConfigError(issues);
626
632
  }
627
633
  /**
628
- * Returns the package-owned authoring contract for hosts with direct worksheet
634
+ * Returns the package-owned authoring contract for hosts with direct document
629
635
  * map capability. Host adapters opt into it; they do not maintain prompt copies.
630
636
  */
631
637
  export function getDeckMapResourceAiInstructions() {
632
- return `## Direct worksheet Deck map resources
638
+ return `## Direct document Deck map resources
633
639
 
634
- When authoring a worksheet map config, use the resource-native Deck JSON contract:
640
+ When authoring a document map config, use the resource-native Deck JSON contract:
635
641
  - A new map must contain at least one config.datasets entry and at least one spec.layers entry.
636
642
  - Every dataset must define source.tableName, source.tableName plus source.transformSql, or source.sqlQuery. Never put sql directly on the dataset object.
637
643
  - Bind every layer to a dataset with _sqlroomsBinding.dataset. Never use data: "@@#datasetId" or an implicit single-dataset binding as a durable resource binding.
638
- - 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.
644
+ - Use supported Deck JSON layer classes such as GeoArrowScatterplotLayer, GeoArrowHeatmapLayer, GeoArrowPolygonLayer, 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.
645
+ - For a standard table-backed longitude/latitude point map, pass the tool's top-level pointBinding with dataset, longitudeColumn, and latitudeColumn. Do not author transformSql, geometryColumn, geometryEncodingHint, or layer geometryColumn for that dataset; the resource writer generates and aligns canonical WKB point geometry. Set geometryColumn in pointBinding only when the default __sqlrooms_geom name is unsuitable.
639
646
  ${getDeckMapSharedAiContractRules()}
640
647
  - 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.
641
648
  - transformSql must be a single SELECT and must read from __sqlrooms_source. Use source.sqlQuery only for a standalone pinned query.
@@ -647,6 +654,6 @@ ${getDeckMapSharedAiContractRules()}
647
654
  - 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.
648
655
 
649
656
  Minimal table-backed point map shape:
650
- {"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"}}`;
657
+ {"tableName":"places","pointBinding":{"dataset":"places","longitudeColumn":"longitude","latitudeColumn":"latitude"},"config":{"configMode":"basic","datasets":{"places":{"source":{"tableName":"places"}}},"spec":{"layers":[{"@@type":"GeoArrowScatterplotLayer","id":"places","_sqlroomsBinding":{"dataset":"places"},"getRadius":4,"radiusUnits":"pixels","pickable":true}]}}}`;
651
658
  }
652
659
  //# sourceMappingURL=mapResourceAuthoring.js.map
@@ -1 +1 @@
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"]}
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';\nimport {DECK_MAP_LAYER_TYPE_OPTIONS} from './mapLayerConfigUtils';\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 ArcLayer: 'GeoArrowArcLayer',\n TripsLayer: 'GeoArrowTripsLayer',\n H3HexagonLayer: 'GeoArrowH3HexagonLayer',\n};\n\nconst DECK_MAP_SUPPORTED_LAYER_TYPES = new Set<string>(\n DECK_MAP_LAYER_TYPE_OPTIONS.map((option) => option.value),\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 } else if (!DECK_MAP_SUPPORTED_LAYER_TYPES.has(layerType)) {\n issues.push({\n path: `spec.layers.${index}.@@type`,\n message: `use a supported Deck map layer type (${[...DECK_MAP_SUPPORTED_LAYER_TYPES].join(', ')}) — \"${layerType}\" is not allowed`,\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 '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 document\n * map capability. Host adapters opt into it; they do not maintain prompt copies.\n */\nexport function getDeckMapResourceAiInstructions(): string {\n return `## Direct document Deck map resources\n\nWhen authoring a document 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. Prefer typed GeoArrow* layers when geometry type is known; GeoJsonLayer is valid for table-backed WKB/GeoJSON via _sqlroomsBinding.\n- For a standard table-backed longitude/latitude point map, pass the tool's top-level pointBinding with dataset, longitudeColumn, and latitudeColumn. Do not author transformSql, geometryColumn, geometryEncodingHint, or layer geometryColumn for that dataset; the resource writer generates and aligns canonical WKB point geometry. Set geometryColumn in pointBinding only when the default __sqlrooms_geom name is unsuitable.\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{\"tableName\":\"places\",\"pointBinding\":{\"dataset\":\"places\",\"longitudeColumn\":\"longitude\",\"latitudeColumn\":\"latitude\"},\"config\":{\"configMode\":\"basic\",\"datasets\":{\"places\":{\"source\":{\"tableName\":\"places\"}}},\"spec\":{\"layers\":[{\"@@type\":\"GeoArrowScatterplotLayer\",\"id\":\"places\",\"_sqlroomsBinding\":{\"dataset\":\"places\"},\"getRadius\":4,\"radiusUnits\":\"pixels\",\"pickable\":true}]}}}`;\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import { type ResolvedTheme } from '@sqlrooms/ui';
2
+ /** Built-in basemaps offered in map settings. IDs are persisted in map configs. */
3
+ export declare const DECK_MAP_BASEMAP_STYLES: readonly [{
4
+ readonly id: "light";
5
+ readonly label: "Light";
6
+ readonly theme: "light";
7
+ }, {
8
+ readonly id: "dark";
9
+ readonly label: "Dark";
10
+ readonly theme: "dark";
11
+ }];
12
+ /** Returns the theme variant for a built-in basemap ID, if recognized. */
13
+ export declare function getDeckMapStyleTheme(style: unknown): ResolvedTheme | undefined;
14
+ /** Snapshots the current app theme as a portable basemap ID at map creation. */
15
+ export declare function getDefaultDeckMapStyle(theme?: ResolvedTheme): string;
16
+ //# sourceMappingURL=mapStyles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapStyles.d.ts","sourceRoot":"","sources":["../src/mapStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,aAAa,EAAC,MAAM,cAAc,CAAC;AAE1D,mFAAmF;AACnF,eAAO,MAAM,uBAAuB;;;;;;;;EAG1B,CAAC;AAEX,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,aAAa,GAAG,SAAS,CAM3B;AAYD,gFAAgF;AAChF,wBAAgB,sBAAsB,CACpC,KAAK,GAAE,aAAiC,GACvC,MAAM,CAER"}
@@ -0,0 +1,32 @@
1
+ import { getTheme } from '@sqlrooms/ui';
2
+ /** Built-in basemaps offered in map settings. IDs are persisted in map configs. */
3
+ export const DECK_MAP_BASEMAP_STYLES = [
4
+ { id: 'light', label: 'Light', theme: 'light' },
5
+ { id: 'dark', label: 'Dark', theme: 'dark' },
6
+ ];
7
+ /** Returns the theme variant for a built-in basemap ID, if recognized. */
8
+ export function getDeckMapStyleTheme(style) {
9
+ // Preserve selections saved by early versions of the Protomaps defaults.
10
+ if (style === 'protomaps-light')
11
+ return 'light';
12
+ if (style === 'protomaps-dark')
13
+ return 'dark';
14
+ return DECK_MAP_BASEMAP_STYLES.find((candidate) => candidate.id === style)
15
+ ?.theme;
16
+ }
17
+ function getCurrentTheme() {
18
+ // ThemeProvider applies the resolved theme here, including hosts with a
19
+ // custom storage key and default theme (such as the CLI).
20
+ if (typeof document !== 'undefined') {
21
+ if (document.documentElement.classList.contains('dark'))
22
+ return 'dark';
23
+ if (document.documentElement.classList.contains('light'))
24
+ return 'light';
25
+ }
26
+ return getTheme();
27
+ }
28
+ /** Snapshots the current app theme as a portable basemap ID at map creation. */
29
+ export function getDefaultDeckMapStyle(theme = getCurrentTheme()) {
30
+ return theme;
31
+ }
32
+ //# sourceMappingURL=mapStyles.js.map