@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.
- package/README.md +193 -35
- package/dist/BlockMapSettings.d.ts.map +1 -1
- package/dist/BlockMapSettings.js +4 -16
- package/dist/BlockMapSettings.js.map +1 -1
- package/dist/DashboardMapSettings.d.ts.map +1 -1
- package/dist/DashboardMapSettings.js +7 -10
- package/dist/DashboardMapSettings.js.map +1 -1
- package/dist/DeckJsonMap.d.ts.map +1 -1
- package/dist/DeckJsonMap.js +75 -23
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/DeckJsonMapSpec.d.ts +41 -0
- package/dist/DeckJsonMapSpec.d.ts.map +1 -1
- package/dist/DeckJsonMapSpec.js +2 -0
- package/dist/DeckJsonMapSpec.js.map +1 -1
- package/dist/DeckMapBasemapSelect.d.ts +9 -0
- package/dist/DeckMapBasemapSelect.d.ts.map +1 -0
- package/dist/DeckMapBasemapSelect.js +20 -0
- package/dist/DeckMapBasemapSelect.js.map +1 -0
- package/dist/DeckMapDefaultStylesProvider.d.ts +13 -19
- package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.js +11 -18
- package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
- package/dist/DeckMapSurface.d.ts +1 -1
- package/dist/DeckMapSurface.js +1 -1
- package/dist/DeckMapSurface.js.map +1 -1
- package/dist/DeckMapsSlice.d.ts +5 -0
- package/dist/DeckMapsSlice.d.ts.map +1 -1
- package/dist/DeckMapsSlice.js +6 -3
- package/dist/DeckMapsSlice.js.map +1 -1
- package/dist/MapSettings.d.ts +14 -0
- package/dist/MapSettings.d.ts.map +1 -1
- package/dist/MapSettings.js +548 -192
- package/dist/MapSettings.js.map +1 -1
- package/dist/MapSettingsControls.d.ts +8 -1
- package/dist/MapSettingsControls.d.ts.map +1 -1
- package/dist/MapSettingsControls.js +24 -2
- package/dist/MapSettingsControls.js.map +1 -1
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +20 -12
- package/dist/ai.js.map +1 -1
- package/dist/aiNormalize.d.ts.map +1 -1
- package/dist/aiNormalize.js +2 -1
- package/dist/aiNormalize.js.map +1 -1
- package/dist/basemap.d.ts +23 -0
- package/dist/basemap.d.ts.map +1 -0
- package/dist/basemap.js +23 -0
- package/dist/basemap.js.map +1 -0
- package/dist/block.d.ts +1 -1
- package/dist/block.d.ts.map +1 -1
- package/dist/block.js +13 -9
- package/dist/block.js.map +1 -1
- package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
- package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
- package/dist/createOrUpdateDeckMapResource.js +57 -4
- package/dist/createOrUpdateDeckMapResource.js.map +1 -1
- package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
- package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
- package/dist/datasets/PreparedDatasetStore.js +4 -8
- package/dist/datasets/PreparedDatasetStore.js.map +1 -1
- package/dist/datasets/helpers.d.ts +39 -2
- package/dist/datasets/helpers.d.ts.map +1 -1
- package/dist/datasets/helpers.js +86 -3
- package/dist/datasets/helpers.js.map +1 -1
- package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
- package/dist/datasets/usePreparedDatasetStates.js +12 -8
- package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/json/colorScaleFunction.d.ts +12 -4
- package/dist/json/colorScaleFunction.d.ts.map +1 -1
- package/dist/json/colorScaleFunction.js.map +1 -1
- package/dist/json/compileColorScale.d.ts +3 -2
- package/dist/json/compileColorScale.d.ts.map +1 -1
- package/dist/json/compileColorScale.js +16 -1
- package/dist/json/compileColorScale.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +235 -175
- package/dist/json/createDeckJsonConfiguration.js.map +1 -1
- package/dist/json/defaultClasses.d.ts.map +1 -1
- package/dist/json/defaultClasses.js +3 -3
- package/dist/json/defaultClasses.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +41 -26
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/heatmapDefaults.d.ts +17 -7
- package/dist/json/heatmapDefaults.d.ts.map +1 -1
- package/dist/json/heatmapDefaults.js +54 -12
- package/dist/json/heatmapDefaults.js.map +1 -1
- package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
- package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckHeatmapLayer.js +69 -0
- package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
- package/dist/json/layers/index.d.ts +1 -0
- package/dist/json/layers/index.d.ts.map +1 -1
- package/dist/json/layers/index.js +1 -0
- package/dist/json/layers/index.js.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.js +13 -5
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
- package/dist/json/scaleFunction.d.ts +5 -8
- package/dist/json/scaleFunction.d.ts.map +1 -1
- package/dist/json/scaleFunction.js +30 -5
- package/dist/json/scaleFunction.js.map +1 -1
- package/dist/mapAiConfig.d.ts +6 -0
- package/dist/mapAiConfig.d.ts.map +1 -1
- package/dist/mapAiConfig.js +7 -0
- package/dist/mapAiConfig.js.map +1 -1
- package/dist/mapAiSharedInstructions.d.ts +1 -1
- package/dist/mapAiSharedInstructions.d.ts.map +1 -1
- package/dist/mapAiSharedInstructions.js +4 -3
- package/dist/mapAiSharedInstructions.js.map +1 -1
- package/dist/mapConfig.d.ts +6 -1
- package/dist/mapConfig.d.ts.map +1 -1
- package/dist/mapConfig.js +28 -3
- package/dist/mapConfig.js.map +1 -1
- package/dist/mapConfigUtils.d.ts +22 -0
- package/dist/mapConfigUtils.d.ts.map +1 -1
- package/dist/mapConfigUtils.js +152 -5
- package/dist/mapConfigUtils.js.map +1 -1
- package/dist/mapLayerConfigUtils.d.ts +55 -0
- package/dist/mapLayerConfigUtils.d.ts.map +1 -1
- package/dist/mapLayerConfigUtils.js +222 -11
- package/dist/mapLayerConfigUtils.js.map +1 -1
- package/dist/mapResourceAuthoring.d.ts +1 -1
- package/dist/mapResourceAuthoring.d.ts.map +1 -1
- package/dist/mapResourceAuthoring.js +14 -7
- package/dist/mapResourceAuthoring.js.map +1 -1
- package/dist/mapStyles.d.ts +16 -0
- package/dist/mapStyles.d.ts.map +1 -0
- package/dist/mapStyles.js +32 -0
- package/dist/mapStyles.js.map +1 -0
- package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
- package/dist/prepare/prepareDeckDataset.js +1 -0
- package/dist/prepare/prepareDeckDataset.js.map +1 -1
- package/dist/prepare/types.d.ts +3 -0
- package/dist/prepare/types.d.ts.map +1 -1
- package/dist/prepare/types.js.map +1 -1
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +62 -16
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +2 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -1
- package/dist/prepare/wkbParser.js +1 -0
- package/dist/prepare/wkbParser.js.map +1 -1
- package/dist/protomapsStyles.d.ts +18 -0
- package/dist/protomapsStyles.d.ts.map +1 -0
- package/dist/protomapsStyles.js +38 -0
- package/dist/protomapsStyles.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +11 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapConfigUtils.js","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getRawSqlTableReference,\n makeQualifiedTableName,\n quoteParsedRawSqlTableReference,\n type DataTable,\n type RawSqlTableReference,\n} from '@sqlrooms/duckdb';\nimport {\n createDeckMapDashboardPanelConfig,\n type DeckMapDashboardPanelConfig,\n type DeckMapConfig,\n} from './mapConfig';\nimport {DECK_TABLE_DATASET_SOURCE_RELATION} from './datasets/tableDatasetSql';\nimport type {GeometryEncodingHint} from './prepare/types';\n\nconst LONGITUDE_COLUMN_NAMES = ['longitude', 'lon', 'lng', 'long', 'x'];\nconst LATITUDE_COLUMN_NAMES = ['latitude', 'lat', 'y'];\nconst GEOMETRY_COLUMN_NAMES = ['geometry', 'geom'];\nconst DEFAULT_GEOMETRY_COLUMN = '__sqlrooms_geom';\nconst DEFAULT_FILL_COLOR = [56, 189, 248, 180] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction updateDeckMapGeometryColumnBindings(\n config: DeckMapDashboardPanelConfig,\n datasetId: string,\n geometryColumn: string | undefined,\n) {\n if (!geometryColumn || !isRecord(config.spec)) return config;\n const layers = config.spec.layers;\n if (!Array.isArray(layers)) return config;\n\n let changed = false;\n const nextLayers = layers.map((layer) => {\n if (!isRecord(layer) || !isRecord(layer._sqlroomsBinding)) return layer;\n const binding = layer._sqlroomsBinding;\n if (\n binding.dataset !== datasetId ||\n typeof binding.geometryColumn !== 'string'\n ) {\n return layer;\n }\n changed = true;\n return {\n ...layer,\n _sqlroomsBinding: {...binding, geometryColumn},\n };\n });\n\n return changed\n ? {...config, spec: {...config.spec, layers: nextLayers}}\n : config;\n}\n\nexport type DeckMapConfigColumn = {name: string; type?: string};\nexport type DeckMapTableReference =\n | string\n | {\n database?: string;\n schema?: string;\n table?: string;\n };\nexport type DeckMapFillColor =\n | [number, number, number]\n | [number, number, number, number];\n\nfunction findColumnByName(\n columns: DeckMapConfigColumn[],\n candidates: string[],\n) {\n const candidateSet = new Set(candidates);\n return columns.find((column) => candidateSet.has(column.name.toLowerCase()))\n ?.name;\n}\n\nfunction resolveDeckMapCoordinateColumnNames(options: {\n columns: DeckMapConfigColumn[];\n longitudeColumn?: string;\n latitudeColumn?: string;\n}) {\n const longitudeColumn =\n options.longitudeColumn ||\n findColumnByName(options.columns, LONGITUDE_COLUMN_NAMES);\n const latitudeColumn =\n options.latitudeColumn ||\n findColumnByName(options.columns, LATITUDE_COLUMN_NAMES);\n return longitudeColumn && latitudeColumn\n ? {longitudeColumn, latitudeColumn}\n : null;\n}\n\nexport function findDeckMapLongitudeLatitudeColumns(\n columns?: DeckMapConfigColumn[],\n) {\n if (!columns) return null;\n return resolveDeckMapCoordinateColumnNames({columns});\n}\n\nexport function findLongitudeLatitudeColumns(table?: DataTable) {\n if (!table) return null;\n return findDeckMapLongitudeLatitudeColumns(table.columns);\n}\n\nfunction inferGeometryEncodingHint(\n column: DeckMapConfigColumn,\n): GeometryEncodingHint | undefined {\n const type = column.type?.toLowerCase();\n if (!type) return undefined;\n if (\n type.includes('wkb') ||\n type.includes('blob') ||\n type.includes('binary')\n ) {\n return 'wkb';\n }\n if (\n type.includes('wkt') ||\n type.includes('varchar') ||\n type.includes('text')\n ) {\n return 'wkt';\n }\n // Native DuckDB GEOMETRY is not an encoding hint — the dataset pipeline\n // projects it through ST_AsWKB via DESCRIBE + SELECT * REPLACE.\n return undefined;\n}\n\nexport function findDeckMapGeometryColumn(columns?: DeckMapConfigColumn[]) {\n if (!columns) return null;\n\n const namedGeometryColumn = findColumnByName(columns, GEOMETRY_COLUMN_NAMES);\n const geometryColumn =\n (namedGeometryColumn\n ? columns.find((column) => column.name === namedGeometryColumn)\n : undefined) ??\n columns.find((column) => {\n const type = column.type?.toLowerCase() ?? '';\n return type.includes('geometry') || type.includes('geoarrow');\n });\n\n if (!geometryColumn) return null;\n return {\n geometryColumn: geometryColumn.name,\n geometryEncodingHint: inferGeometryEncodingHint(geometryColumn),\n };\n}\n\nexport function findGeometryColumn(table?: DataTable) {\n if (!table) return null;\n return findDeckMapGeometryColumn(table.columns);\n}\n\nexport function quoteDeckMapSqlIdentifier(identifier: string) {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nexport function quoteDeckMapSqlTableReference(\n tableReference: DeckMapTableReference,\n): RawSqlTableReference {\n if (typeof tableReference === 'string') {\n const rawSqlTableReference =\n quoteParsedRawSqlTableReference(tableReference);\n if (!rawSqlTableReference) {\n throw new Error(`Invalid deck map table reference \"${tableReference}\".`);\n }\n return rawSqlTableReference;\n }\n if (!tableReference.table) {\n throw new Error('Deck map table reference object requires a table name.');\n }\n return getRawSqlTableReference(\n makeQualifiedTableName({\n database: tableReference.database,\n schema: tableReference.schema,\n table: tableReference.table,\n }),\n );\n}\n\nfunction ensureDeckMapColumnExists(\n columns: DeckMapConfigColumn[],\n columnName: string,\n role: string,\n) {\n if (!columns.some((column) => column.name === columnName)) {\n throw new Error(\n `Unknown ${role} column \"${columnName}\". Available columns: ${columns\n .map((column) => column.name)\n .join(', ')}.`,\n );\n }\n}\n\nfunction resolveDeckMapCoordinateColumns(options: {\n columns: DeckMapConfigColumn[];\n longitudeColumn?: string;\n latitudeColumn?: string;\n}) {\n const coordinates =\n options.longitudeColumn && options.latitudeColumn\n ? {\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n }\n : findDeckMapLongitudeLatitudeColumns(options.columns);\n\n if (!coordinates) {\n throw new Error(\n 'Could not find longitude/latitude columns. Pass longitudeColumn and latitudeColumn explicitly, or provide geometryColumn.',\n );\n }\n\n ensureDeckMapColumnExists(\n options.columns,\n coordinates.longitudeColumn,\n 'longitude',\n );\n ensureDeckMapColumnExists(\n options.columns,\n coordinates.latitudeColumn,\n 'latitude',\n );\n return coordinates;\n}\n\nfunction createDeckMapPointSourceSql(options: {\n sourceSqlQuery?: string;\n tableReference: DeckMapTableReference;\n longitudeColumn: string;\n latitudeColumn: string;\n geometryColumn: string;\n}) {\n const quotedLongitude = quoteDeckMapSqlIdentifier(options.longitudeColumn);\n const quotedLatitude = quoteDeckMapSqlIdentifier(options.latitudeColumn);\n const cleanedSourceSqlQuery = options.sourceSqlQuery\n ?.trim()\n .replace(/(?:\\s*;+\\s*)+$/, '');\n const baseSource = cleanedSourceSqlQuery\n ? `(${cleanedSourceSqlQuery}) AS \"__sqlrooms_dashboard_map_source\"`\n : quoteDeckMapSqlTableReference(options.tableReference);\n\n return [\n `SELECT *, ST_AsWKB(ST_Point(${quotedLongitude}, ${quotedLatitude})) AS ${quoteDeckMapSqlIdentifier(options.geometryColumn)}`,\n `FROM ${baseSource}`,\n `WHERE ${quotedLongitude} IS NOT NULL AND ${quotedLatitude} IS NOT NULL`,\n ].join(' ');\n}\n\n/**\n * Builds the standard lon/lat → WKB point transform SQL used by Deck map\n * datasets that follow the selected table via {@link DECK_TABLE_DATASET_SOURCE_RELATION}.\n */\nexport function createDeckMapPointTransformSql(options: {\n longitudeColumn: string;\n latitudeColumn: string;\n geometryColumn: string;\n}) {\n const quotedLongitude = quoteDeckMapSqlIdentifier(options.longitudeColumn);\n const quotedLatitude = quoteDeckMapSqlIdentifier(options.latitudeColumn);\n\n return [\n `SELECT *, ST_AsWKB(ST_Point(${quotedLongitude}, ${quotedLatitude})) AS ${quoteDeckMapSqlIdentifier(options.geometryColumn)}`,\n `FROM ${DECK_TABLE_DATASET_SOURCE_RELATION}`,\n `WHERE ${quotedLongitude} IS NOT NULL AND ${quotedLatitude} IS NOT NULL`,\n ].join(' ');\n}\n\nconst DECK_MAP_POINT_LAYER_TYPES = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n]);\n\nfunction isDeckMapConfigRecord(\n value: unknown,\n): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction deckMapLayerTargetsDataset(options: {\n layer: Record<string, unknown>;\n datasetId: string;\n datasetIds: string[];\n}) {\n const binding = isDeckMapConfigRecord(options.layer._sqlroomsBinding)\n ? options.layer._sqlroomsBinding\n : undefined;\n const boundDataset = binding?.dataset;\n\n if (typeof boundDataset === 'string') {\n return boundDataset === options.datasetId;\n }\n\n return options.datasetIds.length === 1 && options.layer.data === undefined;\n}\n\nfunction normalizeDeckMapPointLayers<T extends unknown[]>(options: {\n layers: T;\n datasetId: string;\n datasetIds: string[];\n geometryColumn: string;\n}): T {\n let changed = false;\n const layers = options.layers.map((layer) => {\n if (!isDeckMapConfigRecord(layer)) {\n return layer;\n }\n\n const layerType = layer['@@type'];\n if (\n typeof layerType !== 'string' ||\n !DECK_MAP_POINT_LAYER_TYPES.has(layerType) ||\n !deckMapLayerTargetsDataset({\n layer,\n datasetId: options.datasetId,\n datasetIds: options.datasetIds,\n })\n ) {\n return layer;\n }\n\n changed = true;\n const binding = isDeckMapConfigRecord(layer._sqlroomsBinding)\n ? layer._sqlroomsBinding\n : {};\n\n return {\n ...layer,\n _sqlroomsBinding: {\n ...binding,\n dataset:\n typeof binding.dataset === 'string'\n ? binding.dataset\n : options.datasetId,\n geometryColumn: options.geometryColumn,\n },\n };\n });\n\n return (changed ? layers : options.layers) as T;\n}\n\n/**\n * Post-normalizes an existing Deck map config so table-backed lon/lat datasets\n * without `transformSql`, `sqlQuery`, or a native geometry column get a WKB\n * point transform, geometry bindings, and `fitToData.geometryColumn` alignment.\n *\n * Prefer this for AI/tool configs that arrive without a transform. Fresh configs\n * from {@link createDeckMapDashboardConfigForTable} already include the transform;\n * this helper patches in place without rebuilding layers.\n */\nexport function normalizeDeckMapPointConfig<\n T extends DeckMapDashboardPanelConfig,\n>(options: {\n config: T;\n resolveTable: (tableName: string) => DataTable | undefined;\n}): T {\n const {config, resolveTable} = options;\n const datasets = isDeckMapConfigRecord(config.datasets)\n ? config.datasets\n : undefined;\n if (!datasets) {\n return config;\n }\n\n const datasetIds = Object.keys(datasets);\n let nextDatasets = datasets;\n let nextSpec = config.spec;\n let nextFitToData = config.fitToData;\n let changed = false;\n\n for (const [datasetId, datasetValue] of Object.entries(datasets)) {\n if (!isDeckMapConfigRecord(datasetValue)) {\n continue;\n }\n const dataset = datasetValue;\n\n const source = isDeckMapConfigRecord(dataset.source as unknown)\n ? (dataset.source as Record<string, unknown>)\n : undefined;\n const tableName =\n typeof source?.tableName === 'string' ? source.tableName : undefined;\n const configuredGeometryColumn =\n typeof dataset.geometryColumn === 'string'\n ? dataset.geometryColumn.trim()\n : undefined;\n if (\n !tableName ||\n source?.sqlQuery ||\n source?.transformSql ||\n (configuredGeometryColumn &&\n configuredGeometryColumn !== DEFAULT_GEOMETRY_COLUMN)\n ) {\n continue;\n }\n\n const table = resolveTable(tableName);\n if (\n configuredGeometryColumn === DEFAULT_GEOMETRY_COLUMN &&\n table?.columns.some((column) => column.name === configuredGeometryColumn)\n ) {\n continue;\n }\n if (findGeometryColumn(table)) {\n continue;\n }\n const coordinateColumns = findLongitudeLatitudeColumns(table);\n if (!coordinateColumns) {\n continue;\n }\n\n const geometryColumn = DEFAULT_GEOMETRY_COLUMN;\n\n nextDatasets = {\n ...nextDatasets,\n [datasetId]: {\n ...dataset,\n source: {\n ...source,\n tableName,\n transformSql: createDeckMapPointTransformSql({\n ...coordinateColumns,\n geometryColumn,\n }),\n },\n geometryColumn,\n geometryEncodingHint: 'wkb',\n },\n };\n\n if (\n isDeckMapConfigRecord(nextSpec) &&\n Array.isArray(nextSpec.layers) &&\n nextSpec.layers.length > 0\n ) {\n nextSpec = {\n ...nextSpec,\n layers: normalizeDeckMapPointLayers({\n layers: nextSpec.layers,\n datasetId,\n datasetIds,\n geometryColumn,\n }),\n };\n }\n\n nextFitToData =\n isDeckMapConfigRecord(nextFitToData) &&\n nextFitToData.dataset === datasetId\n ? {\n ...nextFitToData,\n geometryColumn,\n }\n : (nextFitToData ?? {\n dataset: datasetId,\n geometryColumn,\n padding: 40,\n maxZoom: 12,\n });\n\n changed = true;\n }\n\n if (!changed) {\n return config;\n }\n\n return {\n ...config,\n spec: nextSpec,\n datasets: nextDatasets,\n fitToData: nextFitToData,\n } as T;\n}\n\nexport function normalizeDeckMapFillColor(\n fillColor?: number[],\n): DeckMapFillColor {\n if (fillColor?.length === 3) {\n return [fillColor[0]!, fillColor[1]!, fillColor[2]!];\n }\n if (fillColor?.length === 4) {\n return [fillColor[0]!, fillColor[1]!, fillColor[2]!, fillColor[3]!];\n }\n return [...DEFAULT_FILL_COLOR];\n}\n\nexport function createDeckMapConfigForTable(options: {\n tableName: string;\n columns: DeckMapConfigColumn[];\n tableReference?: DeckMapTableReference;\n sourceSqlQuery?: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n pointRadius?: number;\n fillColor?: DeckMapFillColor;\n mapStyle?: string;\n}): DeckMapConfig {\n const datasetId = options.tableName;\n const explicitGeometryColumn = options.geometryColumn?.trim() || undefined;\n const detectedCoordinates =\n options.longitudeColumn && options.latitudeColumn\n ? {\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n }\n : findDeckMapLongitudeLatitudeColumns(options.columns);\n const detectedGeometryColumn = explicitGeometryColumn\n ? {\n geometryColumn: explicitGeometryColumn,\n geometryEncodingHint: options.geometryEncodingHint,\n }\n : detectedCoordinates\n ? null\n : findDeckMapGeometryColumn(options.columns);\n const coordinates = detectedGeometryColumn\n ? undefined\n : resolveDeckMapCoordinateColumns({\n columns: options.columns,\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n });\n const geometryColumn =\n detectedGeometryColumn?.geometryColumn ?? DEFAULT_GEOMETRY_COLUMN;\n const geometryEncodingHint =\n options.geometryEncodingHint ??\n detectedGeometryColumn?.geometryEncodingHint;\n const source = coordinates\n ? options.sourceSqlQuery\n ? {\n sqlQuery: createDeckMapPointSourceSql({\n sourceSqlQuery: options.sourceSqlQuery,\n tableReference: options.tableReference ?? options.tableName,\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n geometryColumn,\n }),\n }\n : {\n tableName: options.tableReference\n ? quoteDeckMapSqlTableReference(options.tableReference)\n : options.tableName,\n transformSql: createDeckMapPointTransformSql({\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n geometryColumn,\n }),\n }\n : options.sourceSqlQuery\n ? {sqlQuery: options.sourceSqlQuery}\n : {tableName: options.tableName};\n\n if (detectedGeometryColumn) {\n ensureDeckMapColumnExists(\n options.columns,\n detectedGeometryColumn.geometryColumn,\n 'geometry',\n );\n }\n\n return {\n spec: {\n initialViewState: {longitude: 0, latitude: 20, zoom: 1.5},\n layers: [\n {\n '@@type': coordinates\n ? 'GeoArrowScatterplotLayer'\n : 'GeoArrowPolygonLayer',\n id: datasetId,\n _sqlroomsBinding: {\n dataset: datasetId,\n ...(detectedGeometryColumn\n ? {geometryColumn: detectedGeometryColumn.geometryColumn}\n : {}),\n },\n filled: true,\n stroked: false,\n pickable: true,\n radiusUnits: 'pixels',\n getRadius: options.pointRadius ?? 4,\n getFillColor: options.fillColor ?? [...DEFAULT_FILL_COLOR],\n },\n ],\n },\n datasets: {\n [datasetId]: {\n source,\n geometryColumn,\n geometryEncodingHint: coordinates ? 'wkb' : geometryEncodingHint,\n },\n },\n ...(coordinates\n ? {\n fitToData: {\n dataset: datasetId,\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n padding: 40,\n maxZoom: 12,\n },\n }\n : detectedGeometryColumn\n ? {\n fitToData: {\n dataset: datasetId,\n geometryColumn: detectedGeometryColumn.geometryColumn,\n padding: 40,\n maxZoom: 12,\n },\n }\n : {}),\n ...(options.mapStyle ? {mapStyle: options.mapStyle} : {}),\n };\n}\n\nexport const createDeckMapDashboardConfigForTable = createDeckMapConfigForTable;\n\nexport function createDeckMapDashboardPanelConfigForTable(options: {\n title?: string;\n tableName: string;\n columns: DeckMapConfigColumn[];\n tableReference?: DeckMapTableReference;\n sourceSqlQuery?: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n pointRadius?: number;\n fillColor?: DeckMapFillColor;\n mapStyle?: string;\n}) {\n return createDeckMapDashboardPanelConfig({\n title: options.title,\n ...createDeckMapConfigForTable(options),\n });\n}\n\n/**\n * Regenerates a map's dataset source and fit configuration for a table while\n * preserving an existing single dataset ID so retained layer bindings remain\n * valid. Empty maps adopt the generated dataset and layer spec. Returns the\n * existing config unchanged when the table has no supported geospatial columns\n * or when multiple datasets make the target ambiguous.\n */\nexport function regenerateMapConfigForTable(\n panel: {config: Record<string, unknown>},\n table: DataTable,\n longitudeColumn?: string,\n latitudeColumn?: string,\n) {\n const coordinateColumns = resolveDeckMapCoordinateColumnNames({\n columns: table.columns,\n longitudeColumn,\n latitudeColumn,\n });\n if (!coordinateColumns && !findGeometryColumn(table)) {\n return panel.config;\n }\n\n const existingConfig = panel.config as DeckMapDashboardPanelConfig;\n const existingDatasetIds = Object.keys(existingConfig.datasets ?? {});\n if (existingDatasetIds.length > 1) return panel.config;\n\n const nextConfig = createDeckMapConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n longitudeColumn: coordinateColumns?.longitudeColumn,\n latitudeColumn: coordinateColumns?.latitudeColumn,\n });\n const nextDataset = Object.values(nextConfig.datasets)[0];\n\n if (existingDatasetIds.length === 0) {\n return nextConfig;\n }\n\n if (existingDatasetIds.length === 1 && nextDataset) {\n const datasetId = existingDatasetIds[0]!;\n return updateDeckMapGeometryColumnBindings(\n {\n ...existingConfig,\n datasets: {[datasetId]: nextDataset},\n fitToData: nextConfig.fitToData\n ? {...nextConfig.fitToData, dataset: datasetId}\n : existingConfig.fitToData,\n },\n datasetId,\n nextDataset.geometryColumn,\n );\n }\n\n // Preserve existing layer spec (layer types, styling, bindings) — only\n // update the dataset source and fitToData so the data re-fetches with the\n // new coordinate columns.\n return {\n ...existingConfig,\n datasets: nextConfig.datasets,\n fitToData: nextConfig.fitToData ?? existingConfig.fitToData,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mapConfigUtils.js","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getRawSqlTableReference,\n makeQualifiedTableName,\n quoteParsedRawSqlTableReference,\n type DataTable,\n type RawSqlTableReference,\n} from '@sqlrooms/duckdb';\nimport {\n createDeckMapDashboardPanelConfig,\n isDeckMapTableDatasetSource,\n type DeckMapDashboardPanelConfig,\n type DeckMapConfig,\n} from './mapConfig';\nimport {DECK_TABLE_DATASET_SOURCE_RELATION} from './datasets/tableDatasetSql';\nimport type {GeometryEncodingHint} from './prepare/types';\nimport {getDefaultDeckMapStyle} from './mapStyles';\n\nconst LONGITUDE_COLUMN_NAMES = ['longitude', 'lon', 'lng', 'long', 'x'];\nconst LATITUDE_COLUMN_NAMES = ['latitude', 'lat', 'y'];\nconst GEOMETRY_COLUMN_NAMES = ['geometry', 'geom'];\nconst DEFAULT_GEOMETRY_COLUMN = '__sqlrooms_geom';\nconst DEFAULT_FILL_COLOR = [56, 189, 248, 180] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction updateDeckMapGeometryColumnBindings(\n config: DeckMapDashboardPanelConfig,\n datasetId: string,\n geometryColumn: string | undefined,\n) {\n if (!geometryColumn || !isRecord(config.spec)) return config;\n const layers = config.spec.layers;\n if (!Array.isArray(layers)) return config;\n\n let changed = false;\n const nextLayers = layers.map((layer) => {\n if (!isRecord(layer) || !isRecord(layer._sqlroomsBinding)) return layer;\n const binding = layer._sqlroomsBinding;\n if (\n binding.dataset !== datasetId ||\n typeof binding.geometryColumn !== 'string'\n ) {\n return layer;\n }\n changed = true;\n return {\n ...layer,\n _sqlroomsBinding: {...binding, geometryColumn},\n };\n });\n\n return changed\n ? {...config, spec: {...config.spec, layers: nextLayers}}\n : config;\n}\n\nexport type DeckMapConfigColumn = {name: string; type?: string};\nexport type DeckMapTableReference =\n | string\n | {\n database?: string;\n schema?: string;\n table?: string;\n };\nexport type DeckMapFillColor =\n | [number, number, number]\n | [number, number, number, number];\n\nfunction findColumnByName(\n columns: DeckMapConfigColumn[],\n candidates: string[],\n) {\n const candidateSet = new Set(candidates);\n return columns.find((column) => candidateSet.has(column.name.toLowerCase()))\n ?.name;\n}\n\nfunction resolveDeckMapCoordinateColumnNames(options: {\n columns: DeckMapConfigColumn[];\n longitudeColumn?: string;\n latitudeColumn?: string;\n}) {\n const longitudeColumn =\n options.longitudeColumn ||\n findColumnByName(options.columns, LONGITUDE_COLUMN_NAMES);\n const latitudeColumn =\n options.latitudeColumn ||\n findColumnByName(options.columns, LATITUDE_COLUMN_NAMES);\n return longitudeColumn && latitudeColumn\n ? {longitudeColumn, latitudeColumn}\n : null;\n}\n\nexport function findDeckMapLongitudeLatitudeColumns(\n columns?: DeckMapConfigColumn[],\n) {\n if (!columns) return null;\n return resolveDeckMapCoordinateColumnNames({columns});\n}\n\nexport function findLongitudeLatitudeColumns(table?: DataTable) {\n if (!table) return null;\n return findDeckMapLongitudeLatitudeColumns(table.columns);\n}\n\nfunction inferGeometryEncodingHint(\n column: DeckMapConfigColumn,\n): GeometryEncodingHint | undefined {\n const type = column.type?.toLowerCase();\n if (!type) return undefined;\n if (\n type.includes('wkb') ||\n type.includes('blob') ||\n type.includes('binary')\n ) {\n return 'wkb';\n }\n if (\n type.includes('wkt') ||\n type.includes('varchar') ||\n type.includes('text')\n ) {\n return 'wkt';\n }\n // Native DuckDB GEOMETRY is not an encoding hint — the dataset pipeline\n // projects it through ST_AsWKB via DESCRIBE + SELECT * REPLACE.\n return undefined;\n}\n\nexport function findDeckMapGeometryColumn(columns?: DeckMapConfigColumn[]) {\n if (!columns) return null;\n\n const namedGeometryColumn = findColumnByName(columns, GEOMETRY_COLUMN_NAMES);\n const geometryColumn =\n (namedGeometryColumn\n ? columns.find((column) => column.name === namedGeometryColumn)\n : undefined) ??\n columns.find((column) => {\n const type = column.type?.toLowerCase() ?? '';\n return type.includes('geometry') || type.includes('geoarrow');\n });\n\n if (!geometryColumn) return null;\n return {\n geometryColumn: geometryColumn.name,\n geometryEncodingHint: inferGeometryEncodingHint(geometryColumn),\n };\n}\n\nexport function findGeometryColumn(table?: DataTable) {\n if (!table) return null;\n return findDeckMapGeometryColumn(table.columns);\n}\n\nexport function quoteDeckMapSqlIdentifier(identifier: string) {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nexport function quoteDeckMapSqlTableReference(\n tableReference: DeckMapTableReference,\n): RawSqlTableReference {\n if (typeof tableReference === 'string') {\n const rawSqlTableReference =\n quoteParsedRawSqlTableReference(tableReference);\n if (!rawSqlTableReference) {\n throw new Error(`Invalid deck map table reference \"${tableReference}\".`);\n }\n return rawSqlTableReference;\n }\n if (!tableReference.table) {\n throw new Error('Deck map table reference object requires a table name.');\n }\n return getRawSqlTableReference(\n makeQualifiedTableName({\n database: tableReference.database,\n schema: tableReference.schema,\n table: tableReference.table,\n }),\n );\n}\n\nfunction ensureDeckMapColumnExists(\n columns: DeckMapConfigColumn[],\n columnName: string,\n role: string,\n) {\n if (!columns.some((column) => column.name === columnName)) {\n throw new Error(\n `Unknown ${role} column \"${columnName}\". Available columns: ${columns\n .map((column) => column.name)\n .join(', ')}.`,\n );\n }\n}\n\nfunction resolveDeckMapCoordinateColumns(options: {\n columns: DeckMapConfigColumn[];\n longitudeColumn?: string;\n latitudeColumn?: string;\n}) {\n const coordinates =\n options.longitudeColumn && options.latitudeColumn\n ? {\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n }\n : findDeckMapLongitudeLatitudeColumns(options.columns);\n\n if (!coordinates) {\n throw new Error(\n 'Could not find longitude/latitude columns. Pass longitudeColumn and latitudeColumn explicitly, or provide geometryColumn.',\n );\n }\n\n ensureDeckMapColumnExists(\n options.columns,\n coordinates.longitudeColumn,\n 'longitude',\n );\n ensureDeckMapColumnExists(\n options.columns,\n coordinates.latitudeColumn,\n 'latitude',\n );\n return coordinates;\n}\n\nfunction createDeckMapPointSourceSql(options: {\n sourceSqlQuery?: string;\n tableReference: DeckMapTableReference;\n longitudeColumn: string;\n latitudeColumn: string;\n geometryColumn: string;\n}) {\n const quotedLongitude = quoteDeckMapSqlIdentifier(options.longitudeColumn);\n const quotedLatitude = quoteDeckMapSqlIdentifier(options.latitudeColumn);\n const cleanedSourceSqlQuery = options.sourceSqlQuery\n ?.trim()\n .replace(/(?:\\s*;+\\s*)+$/, '');\n const baseSource = cleanedSourceSqlQuery\n ? `(${cleanedSourceSqlQuery}) AS \"__sqlrooms_dashboard_map_source\"`\n : quoteDeckMapSqlTableReference(options.tableReference);\n\n return [\n `SELECT *, ST_AsWKB(ST_Point(${quotedLongitude}, ${quotedLatitude})) AS ${quoteDeckMapSqlIdentifier(options.geometryColumn)}`,\n `FROM ${baseSource}`,\n `WHERE ${quotedLongitude} IS NOT NULL AND ${quotedLatitude} IS NOT NULL`,\n ].join(' ');\n}\n\n/**\n * Builds the standard lon/lat → WKB point transform SQL used by Deck map\n * datasets that follow the selected table via {@link DECK_TABLE_DATASET_SOURCE_RELATION}.\n */\nexport function createDeckMapPointTransformSql(options: {\n longitudeColumn: string;\n latitudeColumn: string;\n geometryColumn: string;\n}) {\n const quotedLongitude = quoteDeckMapSqlIdentifier(options.longitudeColumn);\n const quotedLatitude = quoteDeckMapSqlIdentifier(options.latitudeColumn);\n\n return [\n `SELECT *, ST_AsWKB(ST_Point(${quotedLongitude}, ${quotedLatitude})) AS ${quoteDeckMapSqlIdentifier(options.geometryColumn)}`,\n `FROM ${DECK_TABLE_DATASET_SOURCE_RELATION}`,\n `WHERE ${quotedLongitude} IS NOT NULL AND ${quotedLatitude} IS NOT NULL`,\n ].join(' ');\n}\n\nconst DECK_MAP_POINT_LAYER_TYPES = new Set([\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n 'GeoJsonLayer',\n]);\n\n/** Structured provenance for a table-backed longitude/latitude point dataset. */\nexport type DeckMapPointBinding = {\n dataset: string;\n longitudeColumn: string;\n latitudeColumn: string;\n geometryColumn?: string;\n};\n\nfunction isDeckMapConfigRecord(\n value: unknown,\n): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction deckMapLayerTargetsDataset(options: {\n layer: Record<string, unknown>;\n datasetId: string;\n datasetIds: string[];\n}) {\n const binding = isDeckMapConfigRecord(options.layer._sqlroomsBinding)\n ? options.layer._sqlroomsBinding\n : undefined;\n const boundDataset = binding?.dataset;\n\n if (typeof boundDataset === 'string') {\n return boundDataset === options.datasetId;\n }\n\n return options.datasetIds.length === 1 && options.layer.data === undefined;\n}\n\nfunction normalizeDeckMapPointLayers<T extends unknown[]>(options: {\n layers: T;\n datasetId: string;\n datasetIds: string[];\n geometryColumn: string;\n}): T {\n let changed = false;\n const layers = options.layers.map((layer) => {\n if (!isDeckMapConfigRecord(layer)) {\n return layer;\n }\n\n const layerType = layer['@@type'];\n if (\n typeof layerType !== 'string' ||\n !DECK_MAP_POINT_LAYER_TYPES.has(layerType) ||\n !deckMapLayerTargetsDataset({\n layer,\n datasetId: options.datasetId,\n datasetIds: options.datasetIds,\n })\n ) {\n return layer;\n }\n\n changed = true;\n const binding = isDeckMapConfigRecord(layer._sqlroomsBinding)\n ? layer._sqlroomsBinding\n : {};\n const geometryBinding = {...binding};\n delete geometryBinding.longitudeColumn;\n delete geometryBinding.latitudeColumn;\n const pointLayer = {...layer};\n delete pointLayer.getPosition;\n\n return {\n ...pointLayer,\n _sqlroomsBinding: {\n ...geometryBinding,\n dataset:\n typeof binding.dataset === 'string'\n ? binding.dataset\n : options.datasetId,\n geometryColumn: options.geometryColumn,\n },\n };\n });\n\n return (changed ? layers : options.layers) as T;\n}\n\n/**\n * Applies a structured longitude/latitude point binding to a native Deck map\n * config. The generated geometry SQL intentionally comes from the same\n * canonical helper used by first-party map builders.\n */\nexport function applyDeckMapPointBinding<\n T extends DeckMapDashboardPanelConfig,\n>(options: {\n config: T;\n pointBinding: DeckMapPointBinding;\n sourceColumns: readonly DeckMapConfigColumn[];\n}): T {\n const {config, pointBinding} = options;\n const datasetId = pointBinding.dataset.trim();\n const longitudeColumn = pointBinding.longitudeColumn.trim();\n const latitudeColumn = pointBinding.latitudeColumn.trim();\n if (!datasetId || !longitudeColumn || !latitudeColumn) {\n throw new Error(\n 'Point binding requires dataset, longitudeColumn, and latitudeColumn.',\n );\n }\n\n const dataset = config.datasets[datasetId];\n if (!dataset) {\n throw new Error(`Point binding references unknown dataset \"${datasetId}\".`);\n }\n if (!isDeckMapTableDatasetSource(dataset.source)) {\n throw new Error(\n `Point binding dataset \"${datasetId}\" must use source.tableName.`,\n );\n }\n\n const geometryColumn =\n pointBinding.geometryColumn?.trim() || DEFAULT_GEOMETRY_COLUMN;\n const sourceColumnNames = new Set(\n options.sourceColumns.map((column) => column.name.toLowerCase()),\n );\n for (const [bindingName, columnName] of [\n ['longitudeColumn', longitudeColumn],\n ['latitudeColumn', latitudeColumn],\n ] as const) {\n if (!sourceColumnNames.has(columnName.toLowerCase())) {\n throw new Error(\n `Point binding ${bindingName} \"${columnName}\" was not found in source columns.`,\n );\n }\n }\n if (sourceColumnNames.has(geometryColumn.toLowerCase())) {\n throw new Error(\n `Point binding geometryColumn \"${geometryColumn}\" conflicts with an existing source column.`,\n );\n }\n const datasetIds = Object.keys(config.datasets);\n let parsedSpec: unknown = config.spec;\n if (typeof parsedSpec === 'string') {\n try {\n parsedSpec = JSON.parse(parsedSpec);\n } catch {\n // Durable resource validation reports the invalid serialized spec.\n }\n }\n const spec = isDeckMapConfigRecord(parsedSpec)\n ? {\n ...parsedSpec,\n ...(Array.isArray(parsedSpec.layers)\n ? {\n layers: normalizeDeckMapPointLayers({\n layers: parsedSpec.layers,\n datasetId,\n datasetIds,\n geometryColumn,\n }),\n }\n : {}),\n }\n : parsedSpec;\n let fitToData = config.fitToData;\n if (isDeckMapConfigRecord(fitToData) && fitToData.dataset === datasetId) {\n const geometryFit = {...fitToData};\n delete geometryFit.longitudeColumn;\n delete geometryFit.latitudeColumn;\n delete geometryFit.geometryColumns;\n delete geometryFit.h3Column;\n fitToData = {...geometryFit, geometryColumn};\n } else if (!fitToData) {\n fitToData = {\n dataset: datasetId,\n geometryColumn,\n padding: 40,\n maxZoom: 12,\n };\n }\n const interaction =\n config.interaction?.type === 'point-radius-brush' &&\n config.interaction.dataset === datasetId\n ? {...config.interaction, longitudeColumn, latitudeColumn}\n : config.interaction;\n\n return {\n ...config,\n spec,\n ...(interaction !== config.interaction ? {interaction} : {}),\n datasets: {\n ...config.datasets,\n [datasetId]: {\n ...dataset,\n source: {\n tableName: dataset.source.tableName,\n transformSql: createDeckMapPointTransformSql({\n longitudeColumn,\n latitudeColumn,\n geometryColumn,\n }),\n },\n geometryColumn,\n geometryEncodingHint: 'wkb',\n },\n },\n fitToData,\n } as T;\n}\n\n/**\n * Post-normalizes an existing Deck map config so table-backed lon/lat datasets\n * without `transformSql`, `sqlQuery`, or a native geometry column get a WKB\n * point transform, geometry bindings, and `fitToData.geometryColumn` alignment.\n *\n * Prefer this for AI/tool configs that arrive without a transform. Fresh configs\n * from {@link createDeckMapDashboardConfigForTable} already include the transform;\n * this helper patches in place without rebuilding layers.\n */\nexport function normalizeDeckMapPointConfig<\n T extends DeckMapDashboardPanelConfig,\n>(options: {\n config: T;\n resolveTable: (tableName: string) => DataTable | undefined;\n}): T {\n const {config, resolveTable} = options;\n const datasets = isDeckMapConfigRecord(config.datasets)\n ? config.datasets\n : undefined;\n if (!datasets) {\n return config;\n }\n\n const datasetIds = Object.keys(datasets);\n let nextDatasets = datasets;\n let nextSpec = config.spec;\n let nextFitToData = config.fitToData;\n let changed = false;\n\n for (const [datasetId, datasetValue] of Object.entries(datasets)) {\n if (!isDeckMapConfigRecord(datasetValue)) {\n continue;\n }\n const dataset = datasetValue;\n\n const source = isDeckMapConfigRecord(dataset.source as unknown)\n ? (dataset.source as Record<string, unknown>)\n : undefined;\n const tableName =\n typeof source?.tableName === 'string' ? source.tableName : undefined;\n const configuredGeometryColumn =\n typeof dataset.geometryColumn === 'string'\n ? dataset.geometryColumn.trim()\n : undefined;\n if (\n !tableName ||\n source?.sqlQuery ||\n source?.transformSql ||\n (configuredGeometryColumn &&\n configuredGeometryColumn !== DEFAULT_GEOMETRY_COLUMN)\n ) {\n continue;\n }\n\n const table = resolveTable(tableName);\n if (\n configuredGeometryColumn === DEFAULT_GEOMETRY_COLUMN &&\n table?.columns.some((column) => column.name === configuredGeometryColumn)\n ) {\n continue;\n }\n if (findGeometryColumn(table)) {\n continue;\n }\n const coordinateColumns = findLongitudeLatitudeColumns(table);\n if (!coordinateColumns) {\n continue;\n }\n\n const geometryColumn = DEFAULT_GEOMETRY_COLUMN;\n\n nextDatasets = {\n ...nextDatasets,\n [datasetId]: {\n ...dataset,\n source: {\n ...source,\n tableName,\n transformSql: createDeckMapPointTransformSql({\n ...coordinateColumns,\n geometryColumn,\n }),\n },\n geometryColumn,\n geometryEncodingHint: 'wkb',\n },\n };\n\n if (\n isDeckMapConfigRecord(nextSpec) &&\n Array.isArray(nextSpec.layers) &&\n nextSpec.layers.length > 0\n ) {\n nextSpec = {\n ...nextSpec,\n layers: normalizeDeckMapPointLayers({\n layers: nextSpec.layers,\n datasetId,\n datasetIds,\n geometryColumn,\n }),\n };\n }\n\n nextFitToData =\n isDeckMapConfigRecord(nextFitToData) &&\n nextFitToData.dataset === datasetId\n ? {\n ...nextFitToData,\n geometryColumn,\n }\n : (nextFitToData ?? {\n dataset: datasetId,\n geometryColumn,\n padding: 40,\n maxZoom: 12,\n });\n\n changed = true;\n }\n\n if (!changed) {\n return config;\n }\n\n return {\n ...config,\n spec: nextSpec,\n datasets: nextDatasets,\n fitToData: nextFitToData,\n } as T;\n}\n\nexport function normalizeDeckMapFillColor(\n fillColor?: number[],\n): DeckMapFillColor {\n if (fillColor?.length === 3) {\n return [fillColor[0]!, fillColor[1]!, fillColor[2]!];\n }\n if (fillColor?.length === 4) {\n return [fillColor[0]!, fillColor[1]!, fillColor[2]!, fillColor[3]!];\n }\n return [...DEFAULT_FILL_COLOR];\n}\n\nexport function createDeckMapConfigForTable(options: {\n tableName: string;\n columns: DeckMapConfigColumn[];\n tableReference?: DeckMapTableReference;\n sourceSqlQuery?: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n pointRadius?: number;\n fillColor?: DeckMapFillColor;\n mapStyle?: string;\n}): DeckMapConfig {\n const datasetId = options.tableName;\n const explicitGeometryColumn = options.geometryColumn?.trim() || undefined;\n const detectedCoordinates =\n options.longitudeColumn && options.latitudeColumn\n ? {\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n }\n : findDeckMapLongitudeLatitudeColumns(options.columns);\n const detectedGeometryColumn = explicitGeometryColumn\n ? {\n geometryColumn: explicitGeometryColumn,\n geometryEncodingHint: options.geometryEncodingHint,\n }\n : detectedCoordinates\n ? null\n : findDeckMapGeometryColumn(options.columns);\n const coordinates = detectedGeometryColumn\n ? undefined\n : resolveDeckMapCoordinateColumns({\n columns: options.columns,\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n });\n const geometryColumn =\n detectedGeometryColumn?.geometryColumn ?? DEFAULT_GEOMETRY_COLUMN;\n const geometryEncodingHint =\n options.geometryEncodingHint ??\n detectedGeometryColumn?.geometryEncodingHint;\n const source = coordinates\n ? options.sourceSqlQuery\n ? {\n sqlQuery: createDeckMapPointSourceSql({\n sourceSqlQuery: options.sourceSqlQuery,\n tableReference: options.tableReference ?? options.tableName,\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n geometryColumn,\n }),\n }\n : {\n tableName: options.tableReference\n ? quoteDeckMapSqlTableReference(options.tableReference)\n : options.tableName,\n transformSql: createDeckMapPointTransformSql({\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n geometryColumn,\n }),\n }\n : options.sourceSqlQuery\n ? {sqlQuery: options.sourceSqlQuery}\n : {tableName: options.tableName};\n\n if (detectedGeometryColumn) {\n ensureDeckMapColumnExists(\n options.columns,\n detectedGeometryColumn.geometryColumn,\n 'geometry',\n );\n }\n\n return {\n spec: {\n initialViewState: {longitude: 0, latitude: 20, zoom: 1.5},\n layers: [\n {\n '@@type': coordinates\n ? 'GeoArrowScatterplotLayer'\n : 'GeoArrowPolygonLayer',\n id: datasetId,\n _sqlroomsBinding: {\n dataset: datasetId,\n ...(detectedGeometryColumn\n ? {geometryColumn: detectedGeometryColumn.geometryColumn}\n : {}),\n },\n filled: true,\n stroked: false,\n pickable: true,\n radiusUnits: 'pixels',\n getRadius: options.pointRadius ?? 4,\n getFillColor: options.fillColor ?? [...DEFAULT_FILL_COLOR],\n },\n ],\n },\n datasets: {\n [datasetId]: {\n source,\n geometryColumn,\n geometryEncodingHint: coordinates ? 'wkb' : geometryEncodingHint,\n },\n },\n ...(coordinates\n ? {\n fitToData: {\n dataset: datasetId,\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n padding: 40,\n maxZoom: 12,\n },\n }\n : detectedGeometryColumn\n ? {\n fitToData: {\n dataset: datasetId,\n geometryColumn: detectedGeometryColumn.geometryColumn,\n padding: 40,\n maxZoom: 12,\n },\n }\n : {}),\n mapStyle: options.mapStyle ?? getDefaultDeckMapStyle(),\n };\n}\n\nexport const createDeckMapDashboardConfigForTable = createDeckMapConfigForTable;\n\nexport function createDeckMapDashboardPanelConfigForTable(options: {\n title?: string;\n tableName: string;\n columns: DeckMapConfigColumn[];\n tableReference?: DeckMapTableReference;\n sourceSqlQuery?: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n pointRadius?: number;\n fillColor?: DeckMapFillColor;\n mapStyle?: string;\n}) {\n return createDeckMapDashboardPanelConfig({\n title: options.title,\n ...createDeckMapConfigForTable(options),\n });\n}\n\n/**\n * Regenerates a map's dataset source and fit configuration for a table while\n * preserving an existing single dataset ID so retained layer bindings remain\n * valid. Empty maps adopt the generated dataset and layer spec. Returns the\n * existing config unchanged when the table has no supported geospatial columns\n * or when multiple datasets make the target ambiguous.\n */\nexport function regenerateMapConfigForTable(\n panel: {config: Record<string, unknown>},\n table: DataTable,\n longitudeColumn?: string,\n latitudeColumn?: string,\n) {\n const coordinateColumns = resolveDeckMapCoordinateColumnNames({\n columns: table.columns,\n longitudeColumn,\n latitudeColumn,\n });\n if (!coordinateColumns && !findGeometryColumn(table)) {\n return panel.config;\n }\n\n const existingConfig = panel.config as DeckMapDashboardPanelConfig;\n const existingDatasetIds = Object.keys(existingConfig.datasets ?? {});\n if (existingDatasetIds.length > 1) return panel.config;\n\n const nextConfig = createDeckMapConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n longitudeColumn: coordinateColumns?.longitudeColumn,\n latitudeColumn: coordinateColumns?.latitudeColumn,\n });\n const nextDataset = Object.values(nextConfig.datasets)[0];\n\n if (existingDatasetIds.length === 0) {\n return {\n ...nextConfig,\n mapStyle: existingConfig.mapStyle,\n mapProps: existingConfig.mapProps,\n };\n }\n\n if (existingDatasetIds.length === 1 && nextDataset) {\n const datasetId = existingDatasetIds[0]!;\n return updateDeckMapGeometryColumnBindings(\n {\n ...existingConfig,\n datasets: {[datasetId]: nextDataset},\n fitToData: nextConfig.fitToData\n ? {...nextConfig.fitToData, dataset: datasetId}\n : existingConfig.fitToData,\n },\n datasetId,\n nextDataset.geometryColumn,\n );\n }\n\n // Preserve existing layer spec (layer types, styling, bindings) — only\n // update the dataset source and fitToData so the data re-fetches with the\n // new coordinate columns.\n return {\n ...existingConfig,\n datasets: nextConfig.datasets,\n fitToData: nextConfig.fitToData ?? existingConfig.fitToData,\n };\n}\n\n/**\n * Applies a document map table pick: regenerate geospatial config when\n * possible, otherwise retarget the single table-backed dataset.\n */\nexport function applyDeckMapTableSelection(\n config: DeckMapConfig,\n table: DataTable,\n longitudeColumn?: string,\n latitudeColumn?: string,\n): DeckMapConfig {\n const regenerated = regenerateMapConfigForTable(\n {config},\n table,\n longitudeColumn,\n latitudeColumn,\n );\n if (regenerated !== config) {\n return regenerated as DeckMapConfig;\n }\n\n const datasetIds = Object.keys(config.datasets ?? {});\n if (datasetIds.length !== 1) return config;\n const datasetId = datasetIds[0]!;\n const dataset = config.datasets[datasetId];\n if (!dataset || !isDeckMapTableDatasetSource(dataset.source)) {\n return config;\n }\n\n const tableName = quoteDeckMapSqlTableReference(table.table);\n if (dataset.source.tableName === tableName) return config;\n\n return {\n ...config,\n datasets: {\n ...config.datasets,\n [datasetId]: {\n ...dataset,\n source: {\n ...dataset.source,\n tableName,\n },\n },\n },\n };\n}\n"]}
|
|
@@ -4,6 +4,11 @@ import type { DeckAutoLayerType } from './types';
|
|
|
4
4
|
export type DeckMapLayerRecord = Record<string, unknown>;
|
|
5
5
|
export type DeckMapLayerColorScaleFunction = ColorScaleConfig & {
|
|
6
6
|
'@@function': 'colorScale';
|
|
7
|
+
/**
|
|
8
|
+
* Per-accessor opacity (0–1). Preferred over layer-level `opacity` so fill and
|
|
9
|
+
* stroke (or arc endpoints) can be dimmed independently.
|
|
10
|
+
*/
|
|
11
|
+
opacity?: number;
|
|
7
12
|
};
|
|
8
13
|
export type DeckMapLayerColorAccessor = 'getFillColor' | 'getLineColor' | 'getColor' | 'getSourceColor' | 'getTargetColor';
|
|
9
14
|
export declare const DECK_MAP_LAYER_TYPE_OPTIONS: ReadonlyArray<{
|
|
@@ -28,6 +33,32 @@ export declare function usesRadiusSetting(layerType: unknown): boolean;
|
|
|
28
33
|
export declare function usesColumnRadiusSetting(layerType: unknown): boolean;
|
|
29
34
|
export declare function usesTripsSettings(layerType: unknown): boolean;
|
|
30
35
|
export declare function usesExtrusionSettings(layerType: unknown): boolean;
|
|
36
|
+
export declare function usesStrokeSetting(layerType: unknown): boolean;
|
|
37
|
+
/** Polygon, GeoJSON, and H3 do not draw strokes while extruded. */
|
|
38
|
+
export declare function usesStrokeExtrusionWarning(layerType: unknown): boolean;
|
|
39
|
+
/** True for GeoArrow / deck H3 hexagon layer class names. */
|
|
40
|
+
export declare function isDeckMapH3HexagonLayer(layerType: unknown): boolean;
|
|
41
|
+
/** Effective `extruded`; H3 and Column default to true when omitted. */
|
|
42
|
+
export declare function getDeckMapLayerExtruded(layer: DeckMapLayerRecord | undefined): boolean;
|
|
43
|
+
/** Default `stroked` when omitted. H3 strokes only when not extruded. */
|
|
44
|
+
export declare function getDeckMapLayerStrokeDefault(layerType: unknown, options?: {
|
|
45
|
+
extruded?: boolean;
|
|
46
|
+
}): boolean;
|
|
47
|
+
/** Bake `layer.opacity` into flat alphas / colorScale.opacity, then drop it. */
|
|
48
|
+
export declare function detachDeckMapLayerOpacity(layer: DeckMapLayerRecord): DeckMapLayerRecord;
|
|
49
|
+
/** Opacity 0–1 on a color-scale accessor (default 1). */
|
|
50
|
+
export declare function getDeckMapColorScaleOpacity(colorScale: DeckMapLayerColorScaleFunction | undefined): number;
|
|
51
|
+
/** Layer-level opacity factor 0–1 (1 when omitted). */
|
|
52
|
+
export declare function getDeckMapLayerOpacityFactor(layer: DeckMapLayerRecord | undefined): number;
|
|
53
|
+
/**
|
|
54
|
+
* Effective 0–100 opacity for a color accessor, including legacy `layer.opacity`.
|
|
55
|
+
* Matches the value the Appearance slider should show before detaching.
|
|
56
|
+
*/
|
|
57
|
+
export declare function getDeckMapLayerChannelOpacityPercent(layer: DeckMapLayerRecord | undefined, accessor: DeckMapLayerColorAccessor, fallbackFlatAlpha?: number): number;
|
|
58
|
+
/** Replace a color scale with flat RGBA (bakes scale opacity into alpha). */
|
|
59
|
+
export declare function replaceDeckMapLayerColorScaleWithFlat(layer: DeckMapLayerRecord, accessor: DeckMapLayerColorAccessor, flatColor: readonly [number, number, number, number]): DeckMapLayerRecord;
|
|
60
|
+
/** Replace multiple color scales with flat RGBA (e.g. arc source+target). */
|
|
61
|
+
export declare function replaceDeckMapLayerColorScalesWithFlat(layer: DeckMapLayerRecord, replacements: Partial<Record<DeckMapLayerColorAccessor, readonly [number, number, number, number]>>): DeckMapLayerRecord;
|
|
31
62
|
export declare function getDeckMapColorAccessorOptions(layerType: unknown): typeof DECK_MAP_COLOR_ACCESSOR_OPTIONS;
|
|
32
63
|
export declare function updateDeckMapLayer(config: DeckMapConfig, layerIndex: number, updater: (layer: DeckMapLayerRecord) => DeckMapLayerRecord): DeckMapConfig;
|
|
33
64
|
export declare function setDeckMapLayerType(config: DeckMapConfig, layerIndex: number, layerType: string): DeckMapConfig;
|
|
@@ -52,11 +83,35 @@ export declare function setDeckMapLayerArcColumns(config: DeckMapConfig, layerIn
|
|
|
52
83
|
export declare function setDeckMapLayerTimestampColumn(config: DeckMapConfig, layerIndex: number, timestampColumn: string): DeckMapConfig;
|
|
53
84
|
export declare function getDeckMapLayerColorScale(layer: DeckMapLayerRecord | undefined, accessor: DeckMapLayerColorAccessor): DeckMapLayerColorScaleFunction | undefined;
|
|
54
85
|
export declare function setDeckMapLayerColorScale(config: DeckMapConfig, layerIndex: number, accessor: DeckMapLayerColorAccessor, colorScale: DeckMapLayerColorScaleFunction): DeckMapConfig;
|
|
86
|
+
/** Default flat fill RGBA. */
|
|
87
|
+
export declare const DECK_MAP_DEFAULT_LAYER_COLOR: readonly [
|
|
88
|
+
number,
|
|
89
|
+
number,
|
|
90
|
+
number,
|
|
91
|
+
number
|
|
92
|
+
];
|
|
93
|
+
/** Default stroke RGBA. */
|
|
94
|
+
export declare const DECK_MAP_DEFAULT_STROKE_COLOR: readonly [
|
|
95
|
+
number,
|
|
96
|
+
number,
|
|
97
|
+
number,
|
|
98
|
+
number
|
|
99
|
+
];
|
|
100
|
+
/** True when `value` is a 3- or 4-channel numeric RGB(A) array. */
|
|
101
|
+
export declare function isDeckMapLayerFlatRgbaColor(value: unknown): value is [number, number, number, number?];
|
|
102
|
+
/** Flat RGBA for an accessor, or undefined if scaled/missing. */
|
|
103
|
+
export declare function getDeckMapLayerFlatColor(layer: DeckMapLayerRecord | undefined, accessor: DeckMapLayerColorAccessor): [number, number, number, number] | undefined;
|
|
104
|
+
/** Set a color accessor to a constant RGB(A); alpha defaults to 255. */
|
|
105
|
+
export declare function setDeckMapLayerFlatColor(config: DeckMapConfig, layerIndex: number, accessor: DeckMapLayerColorAccessor, color: readonly [number, number, number, number?]): DeckMapConfig;
|
|
106
|
+
/** RGBA → `#rrggbb` for `<input type="color">`. */
|
|
107
|
+
export declare function deckMapRgbaToHex(color: readonly [number, number, number, number?]): string;
|
|
55
108
|
export declare function clearDeckMapLayerColorScale(config: DeckMapConfig, layerIndex: number, accessor: DeckMapLayerColorAccessor): DeckMapConfig;
|
|
56
109
|
export declare function createDeckMapLayerColorScale(options: {
|
|
57
110
|
field: string;
|
|
58
111
|
type?: ColorScaleConfig['type'];
|
|
59
112
|
scheme?: ColorScaleScheme;
|
|
60
113
|
title?: string;
|
|
114
|
+
/** Per-accessor opacity 0–1. */
|
|
115
|
+
opacity?: number;
|
|
61
116
|
}): DeckMapLayerColorScaleFunction;
|
|
62
117
|
//# sourceMappingURL=mapLayerConfigUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapLayerConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"mapLayerConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAI/C,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzD,MAAM,MAAM,8BAA8B,GAAG,gBAAgB,GAAG;IAC9D,YAAY,EAAE,YAAY,CAAC;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,cAAc,GACd,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,eAAO,MAAM,2BAA2B,EAAE,aAAa,CAAC;IACtD,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf,CAUA,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,aAAa,CAAC;IAC1D,KAAK,EAAE,yBAAyB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf,CAMA,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,aAAa,CAAC;IAC5D,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,gBAAgB,CAAC;CACjC,CAMA,CAAC;AA0DF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,aAAa,GACpB,kBAAkB,EAAE,CAGtB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,OAAO,WAK3D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,WAIrD;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,WAKtD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,WAKnD;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,WAKzD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,WAKnD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,WAKvD;AAaD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,WAKnD;AAED,mEAAmE;AACnE,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,OAAO,WAS5D;AAED,6DAA6D;AAC7D,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAInE;AAED,wEAAwE;AACxE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,OAAO,CAMT;AAED,yEAAyE;AACzE,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAC,GAC7B,OAAO,CAeT;AASD,gFAAgF;AAChF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,kBAAkB,GACxB,kBAAkB,CAgDpB;AAED,yDAAyD;AACzD,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,8BAA8B,GAAG,SAAS,GACrD,MAAM,CAMR;AAED,uDAAuD;AACvD,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,QAAQ,EAAE,yBAAyB,EACnC,iBAAiB,SAAM,GACtB,MAAM,CASR;AAeD,6EAA6E;AAC7E,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,yBAAyB,EACnC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACnD,kBAAkB,CAMpB;AAED,6EAA6E;AAC7E,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,kBAAkB,EACzB,YAAY,EAAE,OAAO,CACnB,MAAM,CAAC,yBAAyB,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAC7E,GACA,kBAAkB,CAWpB;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,OAAO,GACjB,OAAO,+BAA+B,CA4BxC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,kBAAkB,GACzD,aAAa,CAoBf;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,aAAa,CAwCf;AAUD,qFAAqF;AACrF,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,kBAAkB,GACxB,kBAAkB,CASpB;AAED,qFAAqF;AACrF,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAKT;AAED,wFAAwF;AACxF,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,kBAAkB,EACzB,YAAY,EAAE,MAAM,GACnB,kBAAkB,CAMpB;AAED,qDAAqD;AACrD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,aAAa,CAIf;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,aAAa,CAkCf;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,aAAa,CASf;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,GACA,aAAa,CAQf;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GACtB,aAAa,CAQf;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,QAAQ,EAAE,yBAAyB,GAClC,8BAA8B,GAAG,SAAS,CAK5C;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,yBAAyB,EACnC,UAAU,EAAE,8BAA8B,GACzC,aAAa,CAKf;AAUD,8BAA8B;AAC9B,eAAO,MAAM,4BAA4B,EAAE,SAAS;IAClD,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACoB,CAAC;AAE7B,2BAA2B;AAC3B,eAAO,MAAM,6BAA6B,EAAE,SAAS;IACnD,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACsB,CAAC;AAE/B,mEAAmE;AACnE,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAS5C;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,QAAQ,EAAE,yBAAyB,GAClC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAI9C;AAED,wEAAwE;AACxE,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,yBAAyB,EACnC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAChD,aAAa,CAWf;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAChD,MAAM,CAMR;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,yBAAyB,GAClC,aAAa,CAQf;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,8BAA8B,CA4EjC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEFAULT_HEATMAP_COLOR_RANGE } from './json/heatmapDefaults';
|
|
1
2
|
import { isColorScaleFunction } from './json/layerConfig';
|
|
2
3
|
export const DECK_MAP_LAYER_TYPE_OPTIONS = [
|
|
3
4
|
{ value: 'GeoArrowScatterplotLayer', label: 'Point' },
|
|
@@ -5,7 +6,6 @@ export const DECK_MAP_LAYER_TYPE_OPTIONS = [
|
|
|
5
6
|
{ value: 'GeoArrowColumnLayer', label: 'Column' },
|
|
6
7
|
{ value: 'GeoArrowPathLayer', label: 'Path' },
|
|
7
8
|
{ value: 'GeoArrowPolygonLayer', label: 'Polygon' },
|
|
8
|
-
{ value: 'GeoArrowSolidPolygonLayer', label: 'Solid polygon' },
|
|
9
9
|
{ value: 'GeoArrowArcLayer', label: 'Arc' },
|
|
10
10
|
{ value: 'GeoArrowTripsLayer', label: 'Trips' },
|
|
11
11
|
{ value: 'GeoArrowH3HexagonLayer', label: 'H3 hexagon' },
|
|
@@ -53,7 +53,6 @@ const COLUMN_RADIUS_LAYER_TYPES = new Set([
|
|
|
53
53
|
'geoarrowcolumnlayer',
|
|
54
54
|
'columnlayer',
|
|
55
55
|
]);
|
|
56
|
-
// GeoJSON: elevation/scale compile is geoarrow-only — no extrusion UI here.
|
|
57
56
|
const EXTRUDABLE_LAYER_TYPES = new Set([
|
|
58
57
|
'geoarrowh3hexagonlayer',
|
|
59
58
|
'h3hexagonlayer',
|
|
@@ -63,6 +62,7 @@ const EXTRUDABLE_LAYER_TYPES = new Set([
|
|
|
63
62
|
'polygonlayer',
|
|
64
63
|
'geoarrowsolidpolygonlayer',
|
|
65
64
|
'solidpolygonlayer',
|
|
65
|
+
'geojsonlayer',
|
|
66
66
|
]);
|
|
67
67
|
function isRecord(value) {
|
|
68
68
|
return Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
@@ -107,6 +107,168 @@ export function usesExtrusionSettings(layerType) {
|
|
|
107
107
|
return (typeof layerType === 'string' &&
|
|
108
108
|
EXTRUDABLE_LAYER_TYPES.has(layerType.toLowerCase()));
|
|
109
109
|
}
|
|
110
|
+
const STROKE_LAYER_TYPES = new Set([
|
|
111
|
+
'geoarrowscatterplotlayer',
|
|
112
|
+
'scatterplotlayer',
|
|
113
|
+
'geoarrowh3hexagonlayer',
|
|
114
|
+
'h3hexagonlayer',
|
|
115
|
+
'geoarrowpolygonlayer',
|
|
116
|
+
'polygonlayer',
|
|
117
|
+
// SolidPolygon: no stroked outlines (wireframe only).
|
|
118
|
+
'geojsonlayer',
|
|
119
|
+
]);
|
|
120
|
+
export function usesStrokeSetting(layerType) {
|
|
121
|
+
return (typeof layerType === 'string' &&
|
|
122
|
+
STROKE_LAYER_TYPES.has(layerType.toLowerCase()));
|
|
123
|
+
}
|
|
124
|
+
/** Polygon, GeoJSON, and H3 do not draw strokes while extruded. */
|
|
125
|
+
export function usesStrokeExtrusionWarning(layerType) {
|
|
126
|
+
if (typeof layerType !== 'string')
|
|
127
|
+
return false;
|
|
128
|
+
const type = layerType.toLowerCase();
|
|
129
|
+
return (type === 'geojsonlayer' ||
|
|
130
|
+
type === 'geoarrowpolygonlayer' ||
|
|
131
|
+
type === 'polygonlayer' ||
|
|
132
|
+
H3_LAYER_TYPES.has(type));
|
|
133
|
+
}
|
|
134
|
+
/** True for GeoArrow / deck H3 hexagon layer class names. */
|
|
135
|
+
export function isDeckMapH3HexagonLayer(layerType) {
|
|
136
|
+
return (typeof layerType === 'string' && H3_LAYER_TYPES.has(layerType.toLowerCase()));
|
|
137
|
+
}
|
|
138
|
+
/** Effective `extruded`; H3 and Column default to true when omitted. */
|
|
139
|
+
export function getDeckMapLayerExtruded(layer) {
|
|
140
|
+
if (typeof layer?.extruded === 'boolean')
|
|
141
|
+
return layer.extruded;
|
|
142
|
+
const layerType = layer?.['@@type'];
|
|
143
|
+
return (isDeckMapH3HexagonLayer(layerType) || usesColumnRadiusSetting(layerType));
|
|
144
|
+
}
|
|
145
|
+
/** Default `stroked` when omitted. H3 strokes only when not extruded. */
|
|
146
|
+
export function getDeckMapLayerStrokeDefault(layerType, options) {
|
|
147
|
+
if (typeof layerType !== 'string')
|
|
148
|
+
return false;
|
|
149
|
+
const type = layerType.toLowerCase();
|
|
150
|
+
if (type.includes('scatterplot') ||
|
|
151
|
+
type.includes('solidpolygon') ||
|
|
152
|
+
type === 'solid polygon') {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
if (isDeckMapH3HexagonLayer(layerType)) {
|
|
156
|
+
const extruded = options?.extruded ?? true;
|
|
157
|
+
return !extruded;
|
|
158
|
+
}
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
function deckMapLayerHasActiveStroke(layer) {
|
|
162
|
+
if (typeof layer.stroked === 'boolean')
|
|
163
|
+
return layer.stroked;
|
|
164
|
+
return getDeckMapLayerStrokeDefault(layer['@@type'], {
|
|
165
|
+
extruded: getDeckMapLayerExtruded(layer),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/** Bake `layer.opacity` into flat alphas / colorScale.opacity, then drop it. */
|
|
169
|
+
export function detachDeckMapLayerOpacity(layer) {
|
|
170
|
+
const opacity = layer.opacity;
|
|
171
|
+
if (typeof opacity !== 'number' || !Number.isFinite(opacity)) {
|
|
172
|
+
return layer;
|
|
173
|
+
}
|
|
174
|
+
const factor = Math.max(0, Math.min(1, opacity));
|
|
175
|
+
const next = { ...layer };
|
|
176
|
+
const accessors = getDeckMapColorAccessorOptions(next['@@type']);
|
|
177
|
+
// Implicit Deck defaults are still dimmed by layer.opacity — materialize
|
|
178
|
+
// them so dropping opacity does not leave a sibling channel fully opaque.
|
|
179
|
+
const implicitColor = [0, 0, 0, 255];
|
|
180
|
+
if (accessors.some((option) => option.value === 'getFillColor') &&
|
|
181
|
+
next.getFillColor === undefined &&
|
|
182
|
+
next.filled !== false) {
|
|
183
|
+
next.getFillColor = [...implicitColor];
|
|
184
|
+
}
|
|
185
|
+
if (accessors.some((option) => option.value === 'getLineColor') &&
|
|
186
|
+
next.getLineColor === undefined &&
|
|
187
|
+
deckMapLayerHasActiveStroke(next)) {
|
|
188
|
+
next.getLineColor = [...implicitColor];
|
|
189
|
+
}
|
|
190
|
+
for (const { value } of DECK_MAP_COLOR_ACCESSOR_OPTIONS) {
|
|
191
|
+
const color = next[value];
|
|
192
|
+
if (isDeckMapLayerFlatRgbaColor(color)) {
|
|
193
|
+
const channelAlpha = color[3] ?? 255;
|
|
194
|
+
next[value] = [
|
|
195
|
+
color[0],
|
|
196
|
+
color[1],
|
|
197
|
+
color[2],
|
|
198
|
+
Math.round(Math.max(0, Math.min(255, channelAlpha * factor))),
|
|
199
|
+
];
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const scale = getDeckMapLayerColorScale(next, value);
|
|
203
|
+
if (scale) {
|
|
204
|
+
next[value] = {
|
|
205
|
+
...scale,
|
|
206
|
+
opacity: getDeckMapColorScaleOpacity(scale) * factor,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
const { opacity: _droppedOpacity, ...rest } = next;
|
|
211
|
+
void _droppedOpacity;
|
|
212
|
+
return rest;
|
|
213
|
+
}
|
|
214
|
+
/** Opacity 0–1 on a color-scale accessor (default 1). */
|
|
215
|
+
export function getDeckMapColorScaleOpacity(colorScale) {
|
|
216
|
+
const opacity = colorScale?.opacity;
|
|
217
|
+
if (typeof opacity === 'number' && Number.isFinite(opacity)) {
|
|
218
|
+
return Math.max(0, Math.min(1, opacity));
|
|
219
|
+
}
|
|
220
|
+
return 1;
|
|
221
|
+
}
|
|
222
|
+
/** Layer-level opacity factor 0–1 (1 when omitted). */
|
|
223
|
+
export function getDeckMapLayerOpacityFactor(layer) {
|
|
224
|
+
const opacity = layer?.opacity;
|
|
225
|
+
if (typeof opacity === 'number' && Number.isFinite(opacity)) {
|
|
226
|
+
return Math.max(0, Math.min(1, opacity));
|
|
227
|
+
}
|
|
228
|
+
return 1;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Effective 0–100 opacity for a color accessor, including legacy `layer.opacity`.
|
|
232
|
+
* Matches the value the Appearance slider should show before detaching.
|
|
233
|
+
*/
|
|
234
|
+
export function getDeckMapLayerChannelOpacityPercent(layer, accessor, fallbackFlatAlpha = 255) {
|
|
235
|
+
const factor = getDeckMapLayerOpacityFactor(layer);
|
|
236
|
+
const scale = getDeckMapLayerColorScale(layer, accessor);
|
|
237
|
+
if (scale) {
|
|
238
|
+
return Math.round(getDeckMapColorScaleOpacity(scale) * factor * 100);
|
|
239
|
+
}
|
|
240
|
+
const flat = getDeckMapLayerFlatColor(layer, accessor);
|
|
241
|
+
const alpha = flat?.[3] ?? fallbackFlatAlpha;
|
|
242
|
+
return Math.round((Math.max(0, Math.min(255, alpha * factor)) / 255) * 100);
|
|
243
|
+
}
|
|
244
|
+
function flatColorWithScaleOpacity(color, scale) {
|
|
245
|
+
const opacity = getDeckMapColorScaleOpacity(scale);
|
|
246
|
+
const hasExplicitOpacity = typeof scale?.opacity === 'number' && Number.isFinite(scale.opacity);
|
|
247
|
+
const alpha = hasExplicitOpacity
|
|
248
|
+
? Math.round(Math.max(0, Math.min(255, opacity * 255)))
|
|
249
|
+
: (color[3] ?? 255);
|
|
250
|
+
return [color[0], color[1], color[2], alpha];
|
|
251
|
+
}
|
|
252
|
+
/** Replace a color scale with flat RGBA (bakes scale opacity into alpha). */
|
|
253
|
+
export function replaceDeckMapLayerColorScaleWithFlat(layer, accessor, flatColor) {
|
|
254
|
+
const scale = getDeckMapLayerColorScale(layer, accessor);
|
|
255
|
+
return detachDeckMapLayerOpacity({
|
|
256
|
+
...layer,
|
|
257
|
+
[accessor]: flatColorWithScaleOpacity(flatColor, scale),
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
/** Replace multiple color scales with flat RGBA (e.g. arc source+target). */
|
|
261
|
+
export function replaceDeckMapLayerColorScalesWithFlat(layer, replacements) {
|
|
262
|
+
const next = { ...layer };
|
|
263
|
+
for (const accessor of Object.keys(replacements)) {
|
|
264
|
+
const color = replacements[accessor];
|
|
265
|
+
if (!color)
|
|
266
|
+
continue;
|
|
267
|
+
const scale = getDeckMapLayerColorScale(layer, accessor);
|
|
268
|
+
next[accessor] = flatColorWithScaleOpacity(color, scale);
|
|
269
|
+
}
|
|
270
|
+
return detachDeckMapLayerOpacity(next);
|
|
271
|
+
}
|
|
110
272
|
export function getDeckMapColorAccessorOptions(layerType) {
|
|
111
273
|
if (layerType === 'GeoArrowPathLayer' || layerType === 'GeoArrowTripsLayer') {
|
|
112
274
|
return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter((option) => option.value === 'getColor');
|
|
@@ -146,9 +308,20 @@ export function setDeckMapLayerType(config, layerIndex, layerType) {
|
|
|
146
308
|
'@@type': layerType,
|
|
147
309
|
};
|
|
148
310
|
const lt = layerType.toLowerCase();
|
|
149
|
-
if (lt === '
|
|
150
|
-
|
|
151
|
-
|
|
311
|
+
if (lt === 'geoarrowheatmaplayer') {
|
|
312
|
+
if (!Array.isArray(nextLayer.colorRange) ||
|
|
313
|
+
nextLayer.colorRange.length === 0) {
|
|
314
|
+
nextLayer.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;
|
|
315
|
+
}
|
|
316
|
+
return nextLayer;
|
|
317
|
+
}
|
|
318
|
+
const colorAccessors = getDeckMapColorAccessorOptions(layerType);
|
|
319
|
+
if (colorAccessors.some((option) => option.value === 'getFillColor') &&
|
|
320
|
+
nextLayer.getFillColor === undefined &&
|
|
321
|
+
nextLayer.filled !== false) {
|
|
322
|
+
nextLayer.getFillColor = [...DECK_MAP_DEFAULT_LAYER_COLOR];
|
|
323
|
+
}
|
|
324
|
+
if (lt === 'geoarrowcolumnlayer') {
|
|
152
325
|
const radius = typeof nextLayer.radius === 'number' &&
|
|
153
326
|
Number.isFinite(nextLayer.radius) &&
|
|
154
327
|
nextLayer.radius > 0
|
|
@@ -277,26 +450,64 @@ const DEFAULT_LAYER_FILL_COLOR = [
|
|
|
277
450
|
const DEFAULT_LAYER_STROKE_COLOR = [
|
|
278
451
|
0, 0, 0, 255,
|
|
279
452
|
];
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
453
|
+
/** Default flat fill RGBA. */
|
|
454
|
+
export const DECK_MAP_DEFAULT_LAYER_COLOR = DEFAULT_LAYER_FILL_COLOR;
|
|
455
|
+
/** Default stroke RGBA. */
|
|
456
|
+
export const DECK_MAP_DEFAULT_STROKE_COLOR = DEFAULT_LAYER_STROKE_COLOR;
|
|
457
|
+
/** True when `value` is a 3- or 4-channel numeric RGB(A) array. */
|
|
458
|
+
export function isDeckMapLayerFlatRgbaColor(value) {
|
|
459
|
+
return (Array.isArray(value) &&
|
|
460
|
+
value.length >= 3 &&
|
|
461
|
+
value.length <= 4 &&
|
|
462
|
+
value.every((channel) => typeof channel === 'number' && Number.isFinite(channel)));
|
|
463
|
+
}
|
|
464
|
+
/** Flat RGBA for an accessor, or undefined if scaled/missing. */
|
|
465
|
+
export function getDeckMapLayerFlatColor(layer, accessor) {
|
|
466
|
+
const value = layer?.[accessor];
|
|
467
|
+
if (!isDeckMapLayerFlatRgbaColor(value))
|
|
468
|
+
return undefined;
|
|
469
|
+
return [value[0], value[1], value[2], value[3] ?? 255];
|
|
470
|
+
}
|
|
471
|
+
/** Set a color accessor to a constant RGB(A); alpha defaults to 255. */
|
|
472
|
+
export function setDeckMapLayerFlatColor(config, layerIndex, accessor, color) {
|
|
473
|
+
const rgba = [
|
|
474
|
+
color[0],
|
|
475
|
+
color[1],
|
|
476
|
+
color[2],
|
|
477
|
+
color[3] ?? 255,
|
|
478
|
+
];
|
|
284
479
|
return updateDeckMapLayer(config, layerIndex, (layer) => ({
|
|
285
480
|
...layer,
|
|
286
|
-
|
|
287
|
-
[accessor]: [...defaultColor],
|
|
481
|
+
[accessor]: rgba,
|
|
288
482
|
}));
|
|
289
483
|
}
|
|
484
|
+
/** RGBA → `#rrggbb` for `<input type="color">`. */
|
|
485
|
+
export function deckMapRgbaToHex(color) {
|
|
486
|
+
const toHex = (channel) => Math.max(0, Math.min(255, Math.round(channel)))
|
|
487
|
+
.toString(16)
|
|
488
|
+
.padStart(2, '0');
|
|
489
|
+
return `#${toHex(color[0])}${toHex(color[1])}${toHex(color[2])}`;
|
|
490
|
+
}
|
|
491
|
+
export function clearDeckMapLayerColorScale(config, layerIndex, accessor) {
|
|
492
|
+
const defaultColor = accessor === 'getLineColor'
|
|
493
|
+
? DECK_MAP_DEFAULT_STROKE_COLOR
|
|
494
|
+
: DECK_MAP_DEFAULT_LAYER_COLOR;
|
|
495
|
+
return updateDeckMapLayer(config, layerIndex, (layer) => replaceDeckMapLayerColorScaleWithFlat(layer, accessor, defaultColor));
|
|
496
|
+
}
|
|
290
497
|
export function createDeckMapLayerColorScale(options) {
|
|
291
498
|
const type = options.type ?? 'sequential';
|
|
292
499
|
const scheme = options.scheme ??
|
|
293
500
|
DECK_MAP_COLOR_SCALE_TYPE_OPTIONS.find((option) => option.value === type)
|
|
294
501
|
?.defaultScheme ??
|
|
295
502
|
'Viridis';
|
|
503
|
+
const opacity = typeof options.opacity === 'number' && Number.isFinite(options.opacity)
|
|
504
|
+
? Math.max(0, Math.min(1, options.opacity))
|
|
505
|
+
: undefined;
|
|
296
506
|
const base = {
|
|
297
507
|
'@@function': 'colorScale',
|
|
298
508
|
field: options.field,
|
|
299
509
|
legend: { title: options.title ?? options.field },
|
|
510
|
+
...(opacity !== undefined ? { opacity } : {}),
|
|
300
511
|
};
|
|
301
512
|
if (type === 'categorical') {
|
|
302
513
|
return {
|