@sqlrooms/deck 0.29.0-rc.10 → 0.29.0-rc.12
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 +88 -16
- 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 +20 -18
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/DeckJsonMapSpec.d.ts +916 -53
- package/dist/DeckJsonMapSpec.d.ts.map +1 -1
- package/dist/DeckJsonMapSpec.js +9 -0
- package/dist/DeckJsonMapSpec.js.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.d.ts +3 -4
- package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.js +13 -7
- 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/MapSettings.d.ts +14 -0
- package/dist/MapSettings.d.ts.map +1 -1
- package/dist/MapSettings.js +555 -186
- 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 +19 -5
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +63 -112
- package/dist/ai.js.map +1 -1
- package/dist/aiNormalize.d.ts +31 -0
- package/dist/aiNormalize.d.ts.map +1 -0
- package/dist/aiNormalize.js +630 -0
- package/dist/aiNormalize.js.map +1 -0
- package/dist/block.d.ts +1 -1
- package/dist/block.d.ts.map +1 -1
- package/dist/block.js +1 -1
- 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/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +72 -8
- package/dist/dashboard.js.map +1 -1
- package/dist/dashboardConfig.d.ts +10 -1
- package/dist/dashboardConfig.d.ts.map +1 -1
- package/dist/dashboardConfig.js +55 -22
- package/dist/dashboardConfig.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 +35 -10
- 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/datasets/wrapGeometryAsWkb.d.ts +20 -0
- package/dist/datasets/wrapGeometryAsWkb.d.ts.map +1 -0
- package/dist/datasets/wrapGeometryAsWkb.js +65 -0
- package/dist/datasets/wrapGeometryAsWkb.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- 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/compileGeoArrowAccessor.d.ts +5 -0
- package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -1
- package/dist/json/compileGeoArrowAccessor.js +17 -3
- package/dist/json/compileGeoArrowAccessor.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +278 -151
- 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 +43 -14
- 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/DeckH3HexagonLayer.d.ts.map +1 -1
- package/dist/json/layers/DeckH3HexagonLayer.js +9 -14
- package/dist/json/layers/DeckH3HexagonLayer.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/h3IndexFormat.d.ts +6 -0
- package/dist/json/layers/h3IndexFormat.d.ts.map +1 -0
- package/dist/json/layers/h3IndexFormat.js +17 -0
- package/dist/json/layers/h3IndexFormat.js.map +1 -0
- package/dist/json/layers/index.d.ts +2 -0
- package/dist/json/layers/index.d.ts.map +1 -1
- package/dist/json/layers/index.js +2 -0
- package/dist/json/layers/index.js.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.js +22 -5
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
- package/dist/json/scaleFunction.d.ts +27 -0
- package/dist/json/scaleFunction.d.ts.map +1 -0
- package/dist/json/scaleFunction.js +151 -0
- package/dist/json/scaleFunction.js.map +1 -0
- package/dist/mapAiConfig.d.ts +8 -0
- package/dist/mapAiConfig.d.ts.map +1 -1
- package/dist/mapAiConfig.js +9 -1
- package/dist/mapAiConfig.js.map +1 -1
- package/dist/mapAiSharedInstructions.d.ts +3 -0
- package/dist/mapAiSharedInstructions.d.ts.map +1 -0
- package/dist/mapAiSharedInstructions.js +16 -0
- package/dist/mapAiSharedInstructions.js.map +1 -0
- package/dist/mapConfig.d.ts +7 -1
- package/dist/mapConfig.d.ts.map +1 -1
- 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 +147 -3
- package/dist/mapConfigUtils.js.map +1 -1
- package/dist/mapFit.d.ts +16 -0
- package/dist/mapFit.d.ts.map +1 -1
- package/dist/mapFit.js +208 -30
- package/dist/mapFit.js.map +1 -1
- package/dist/mapLayerConfigUtils.d.ts +64 -1
- package/dist/mapLayerConfigUtils.d.ts.map +1 -1
- package/dist/mapLayerConfigUtils.js +277 -16
- package/dist/mapLayerConfigUtils.js.map +1 -1
- package/dist/mapResourceAuthoring.d.ts +3 -1
- package/dist/mapResourceAuthoring.d.ts.map +1 -1
- package/dist/mapResourceAuthoring.js +413 -20
- package/dist/mapResourceAuthoring.js.map +1 -1
- package/dist/mosaic.d.ts +1 -1
- package/dist/mosaic.d.ts.map +1 -1
- package/dist/mosaic.js.map +1 -1
- package/dist/prepare/geoarrow.js.map +1 -1
- 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 +10 -0
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +141 -20
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +9 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -1
- package/dist/prepare/wkbParser.js +22 -0
- package/dist/prepare/wkbParser.js.map +1 -1
- package/dist/selectStarAsWkbCollision.d.ts +3 -0
- package/dist/selectStarAsWkbCollision.d.ts.map +1 -0
- package/dist/selectStarAsWkbCollision.js +78 -0
- package/dist/selectStarAsWkbCollision.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/useDeckMapFitToBounds.d.ts.map +1 -1
- package/dist/useDeckMapFitToBounds.js +1 -1
- package/dist/useDeckMapFitToBounds.js.map +1 -1
- package/package.json +15 -15
package/dist/mapConfig.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapConfig.js","sourceRoot":"","sources":["../src/mapConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAO9C,MAAM,CAAC,MAAM,6BAA6B,GAAG,eAAe,CAAC;AAC7D,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AAgBxD,0EAA0E;AAC1E,MAAM,UAAU,yBAAyB,CACvC,MAAwC;IAExC,OAAO,OAAO,CAAC,MAAM,IAAI,UAAU,IAAI,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,2BAA2B,CACzC,MAAwC;IAExC,OAAO,OAAO,CAAC,MAAM,IAAI,WAAW,IAAI,MAAM,CAAC,CAAC;AAClD,CAAC;
|
|
1
|
+
{"version":3,"file":"mapConfig.js","sourceRoot":"","sources":["../src/mapConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAO9C,MAAM,CAAC,MAAM,6BAA6B,GAAG,eAAe,CAAC;AAC7D,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AAgBxD,0EAA0E;AAC1E,MAAM,UAAU,yBAAyB,CACvC,MAAwC;IAExC,OAAO,OAAO,CAAC,MAAM,IAAI,UAAU,IAAI,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,2BAA2B,CACzC,MAAwC;IAExC,OAAO,OAAO,CAAC,MAAM,IAAI,WAAW,IAAI,MAAM,CAAC,CAAC;AAClD,CAAC;AA2CD,wEAAwE;AACxE,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,IAAI,EAAE;YACJ,gBAAgB,EAAE,EAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAC;YACzD,MAAM,EAAE,EAAE;SACX;QACD,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AASD,MAAM,CAAC,MAAM,kCAAkC,GAAG,yBAAyB,CAAC;AAC5E,MAAM,CAAC,MAAM,oCAAoC,GAAG,2BAA2B,CAAC;AAMhF,oEAAoE;AACpE,MAAM,UAAU,iCAAiC,CAC/C,OAAiD;IAEjD,MAAM,EAAC,KAAK,EAAE,GAAG,MAAM,EAAC,GAAG,OAAO,CAAC;IACnC,OAAO;QACL,EAAE,EAAE,QAAQ,EAAE;QACd,IAAI,EAAE,6BAA6B;QACnC,KAAK,EAAE,KAAK,IAAI,KAAK;QACrB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAA4B;KACtE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAA+B;IAE/B,IACE,CAAC,MAAM,CAAC,IAAI;QACZ,CAAC,MAAM,CAAC,QAAQ;QAChB,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACnC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAuB,CAAC;AACjC,CAAC","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport type {\n DeckJsonMapProps,\n DeckSqlDatasetInput,\n DeckTableDatasetInput,\n} from './types';\n\nexport const DECK_MAP_DASHBOARD_PANEL_TYPE = 'deck-json-map';\nexport const DEFAULT_DECK_MAP_MAX_DATA_POINTS = 100_000;\n\nexport type DeckMapDataPolicyOverride = {\n disabled?: boolean;\n maxRows?: number;\n reason?: string;\n};\n\nexport type DeckMapDatasetSource =\n | Pick<DeckSqlDatasetInput, 'sqlQuery'>\n | Pick<DeckTableDatasetInput, 'tableName' | 'transformSql'>;\n\nexport type DeckMapDatasetConfig = Omit<DeckSqlDatasetInput, 'sqlQuery'> & {\n source?: DeckMapDatasetSource;\n};\n\n/** Returns whether a map dataset source is a pinned literal SQL query. */\nexport function isDeckMapSqlDatasetSource(\n source: DeckMapDatasetSource | undefined,\n): source is Pick<DeckSqlDatasetInput, 'sqlQuery'> {\n return Boolean(source && 'sqlQuery' in source);\n}\n\n/** Returns whether a map dataset source is backed by a named table. */\nexport function isDeckMapTableDatasetSource(\n source: DeckMapDatasetSource | undefined,\n): source is Pick<DeckTableDatasetInput, 'tableName' | 'transformSql'> {\n return Boolean(source && 'tableName' in source);\n}\n\nexport type DeckMapInteractionConfig = {\n type: 'point-radius-brush';\n dataset: string;\n longitudeColumn: string;\n latitudeColumn: string;\n radiusMeters?: number;\n event?: 'hover' | 'click';\n};\n\nexport type DeckMapFitToDataConfig = {\n dataset: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n /**\n * Multiple geometry columns whose extents should be combined when fitting\n * the view. Used for arc layers that have separate source and target\n * geometries — a single `geometryColumn` would only cover one endpoint.\n */\n geometryColumns?: string[];\n h3Column?: string;\n padding?: number;\n maxZoom?: number;\n};\n\nexport type DeckMapConfigMode = 'basic' | 'custom';\n\n/** Durable, host-neutral Deck map configuration. */\nexport type DeckMapConfig = {\n spec: DeckJsonMapProps['spec'];\n datasets: Record<string, DeckMapDatasetConfig>;\n configMode?: DeckMapConfigMode;\n mapStyle?: string;\n mapProps?: Record<string, unknown>;\n showLegends?: boolean;\n interaction?: DeckMapInteractionConfig;\n fitToData?: DeckMapFitToDataConfig;\n dataPolicy?: DeckMapDataPolicyOverride;\n settingsOpen?: boolean;\n};\n\n/** Creates the portable empty configuration used for a new Deck map. */\nexport function createEmptyDeckMapConfig(): DeckMapConfig {\n return {\n spec: {\n initialViewState: {longitude: 0, latitude: 20, zoom: 1.5},\n layers: [],\n },\n datasets: {},\n };\n}\n\n/** Adapter-facing dashboard panel shape; document resources never store it. */\nexport type DeckMapDashboardPanelConfig = DeckMapConfig;\nexport type DeckMapDashboardDatasetConfig = DeckMapDatasetConfig;\nexport type DeckMapDashboardDatasetSource = DeckMapDatasetSource;\nexport type DeckMapDashboardInteractionConfig = DeckMapInteractionConfig;\nexport type DeckMapDashboardFitToDataConfig = DeckMapFitToDataConfig;\n\nexport const isDeckMapDashboardSqlDatasetSource = isDeckMapSqlDatasetSource;\nexport const isDeckMapDashboardTableDatasetSource = isDeckMapTableDatasetSource;\n\nexport type CreateDeckMapDashboardPanelConfigOptions = DeckMapConfig & {\n title?: string;\n};\n\n/** Creates a Mosaic panel only for the opt-in dashboard adapter. */\nexport function createDeckMapDashboardPanelConfig(\n options: CreateDeckMapDashboardPanelConfigOptions,\n) {\n const {title, ...config} = options;\n return {\n id: createId(),\n type: DECK_MAP_DASHBOARD_PANEL_TYPE,\n title: title ?? 'Map',\n config: JSON.parse(JSON.stringify(config)) as Record<string, unknown>,\n };\n}\n\n/**\n * Returns a record as a Deck map config when it has the required top-level\n * spec and dataset registry, otherwise returns `null`.\n */\nexport function asDeckJsonMapConfig(\n config: Record<string, unknown>,\n): DeckMapConfig | null {\n if (\n !config.spec ||\n !config.datasets ||\n typeof config.datasets !== 'object' ||\n Array.isArray(config.datasets)\n ) {\n return null;\n }\n return config as DeckMapConfig;\n}\n"]}
|
package/dist/mapConfigUtils.d.ts
CHANGED
|
@@ -38,6 +38,23 @@ export declare function createDeckMapPointTransformSql(options: {
|
|
|
38
38
|
latitudeColumn: string;
|
|
39
39
|
geometryColumn: string;
|
|
40
40
|
}): string;
|
|
41
|
+
/** Structured provenance for a table-backed longitude/latitude point dataset. */
|
|
42
|
+
export type DeckMapPointBinding = {
|
|
43
|
+
dataset: string;
|
|
44
|
+
longitudeColumn: string;
|
|
45
|
+
latitudeColumn: string;
|
|
46
|
+
geometryColumn?: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Applies a structured longitude/latitude point binding to a native Deck map
|
|
50
|
+
* config. The generated geometry SQL intentionally comes from the same
|
|
51
|
+
* canonical helper used by first-party map builders.
|
|
52
|
+
*/
|
|
53
|
+
export declare function applyDeckMapPointBinding<T extends DeckMapDashboardPanelConfig>(options: {
|
|
54
|
+
config: T;
|
|
55
|
+
pointBinding: DeckMapPointBinding;
|
|
56
|
+
sourceColumns: readonly DeckMapConfigColumn[];
|
|
57
|
+
}): T;
|
|
41
58
|
/**
|
|
42
59
|
* Post-normalizes an existing Deck map config so table-backed lon/lat datasets
|
|
43
60
|
* without `transformSql`, `sqlQuery`, or a native geometry column get a WKB
|
|
@@ -108,4 +125,9 @@ export declare function regenerateMapConfigForTable(panel: {
|
|
|
108
125
|
dataPolicy?: import("./mapConfig").DeckMapDataPolicyOverride;
|
|
109
126
|
settingsOpen?: boolean;
|
|
110
127
|
};
|
|
128
|
+
/**
|
|
129
|
+
* Applies a document map table pick: regenerate geospatial config when
|
|
130
|
+
* possible, otherwise retarget the single table-backed dataset.
|
|
131
|
+
*/
|
|
132
|
+
export declare function applyDeckMapTableSelection(config: DeckMapConfig, table: DataTable, longitudeColumn?: string, latitudeColumn?: string): DeckMapConfig;
|
|
111
133
|
//# sourceMappingURL=mapConfigUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"mapConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"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"}
|
package/dist/mapConfigUtils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getRawSqlTableReference, makeQualifiedTableName, quoteParsedRawSqlTableReference, } from '@sqlrooms/duckdb';
|
|
2
|
-
import { createDeckMapDashboardPanelConfig, } from './mapConfig';
|
|
2
|
+
import { createDeckMapDashboardPanelConfig, isDeckMapTableDatasetSource, } from './mapConfig';
|
|
3
3
|
import { DECK_TABLE_DATASET_SOURCE_RELATION } from './datasets/tableDatasetSql';
|
|
4
4
|
const LONGITUDE_COLUMN_NAMES = ['longitude', 'lon', 'lng', 'long', 'x'];
|
|
5
5
|
const LATITUDE_COLUMN_NAMES = ['latitude', 'lat', 'y'];
|
|
@@ -72,6 +72,8 @@ function inferGeometryEncodingHint(column) {
|
|
|
72
72
|
type.includes('text')) {
|
|
73
73
|
return 'wkt';
|
|
74
74
|
}
|
|
75
|
+
// Native DuckDB GEOMETRY is not an encoding hint — the dataset pipeline
|
|
76
|
+
// projects it through ST_AsWKB via DESCRIBE + SELECT * REPLACE.
|
|
75
77
|
return undefined;
|
|
76
78
|
}
|
|
77
79
|
export function findDeckMapGeometryColumn(columns) {
|
|
@@ -170,6 +172,7 @@ const DECK_MAP_POINT_LAYER_TYPES = new Set([
|
|
|
170
172
|
'GeoArrowScatterplotLayer',
|
|
171
173
|
'GeoArrowHeatmapLayer',
|
|
172
174
|
'GeoArrowColumnLayer',
|
|
175
|
+
'GeoJsonLayer',
|
|
173
176
|
]);
|
|
174
177
|
function isDeckMapConfigRecord(value) {
|
|
175
178
|
return Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
@@ -204,10 +207,15 @@ function normalizeDeckMapPointLayers(options) {
|
|
|
204
207
|
const binding = isDeckMapConfigRecord(layer._sqlroomsBinding)
|
|
205
208
|
? layer._sqlroomsBinding
|
|
206
209
|
: {};
|
|
210
|
+
const geometryBinding = { ...binding };
|
|
211
|
+
delete geometryBinding.longitudeColumn;
|
|
212
|
+
delete geometryBinding.latitudeColumn;
|
|
213
|
+
const pointLayer = { ...layer };
|
|
214
|
+
delete pointLayer.getPosition;
|
|
207
215
|
return {
|
|
208
|
-
...
|
|
216
|
+
...pointLayer,
|
|
209
217
|
_sqlroomsBinding: {
|
|
210
|
-
...
|
|
218
|
+
...geometryBinding,
|
|
211
219
|
dataset: typeof binding.dataset === 'string'
|
|
212
220
|
? binding.dataset
|
|
213
221
|
: options.datasetId,
|
|
@@ -217,6 +225,108 @@ function normalizeDeckMapPointLayers(options) {
|
|
|
217
225
|
});
|
|
218
226
|
return (changed ? layers : options.layers);
|
|
219
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* Applies a structured longitude/latitude point binding to a native Deck map
|
|
230
|
+
* config. The generated geometry SQL intentionally comes from the same
|
|
231
|
+
* canonical helper used by first-party map builders.
|
|
232
|
+
*/
|
|
233
|
+
export function applyDeckMapPointBinding(options) {
|
|
234
|
+
const { config, pointBinding } = options;
|
|
235
|
+
const datasetId = pointBinding.dataset.trim();
|
|
236
|
+
const longitudeColumn = pointBinding.longitudeColumn.trim();
|
|
237
|
+
const latitudeColumn = pointBinding.latitudeColumn.trim();
|
|
238
|
+
if (!datasetId || !longitudeColumn || !latitudeColumn) {
|
|
239
|
+
throw new Error('Point binding requires dataset, longitudeColumn, and latitudeColumn.');
|
|
240
|
+
}
|
|
241
|
+
const dataset = config.datasets[datasetId];
|
|
242
|
+
if (!dataset) {
|
|
243
|
+
throw new Error(`Point binding references unknown dataset "${datasetId}".`);
|
|
244
|
+
}
|
|
245
|
+
if (!isDeckMapTableDatasetSource(dataset.source)) {
|
|
246
|
+
throw new Error(`Point binding dataset "${datasetId}" must use source.tableName.`);
|
|
247
|
+
}
|
|
248
|
+
const geometryColumn = pointBinding.geometryColumn?.trim() || DEFAULT_GEOMETRY_COLUMN;
|
|
249
|
+
const sourceColumnNames = new Set(options.sourceColumns.map((column) => column.name.toLowerCase()));
|
|
250
|
+
for (const [bindingName, columnName] of [
|
|
251
|
+
['longitudeColumn', longitudeColumn],
|
|
252
|
+
['latitudeColumn', latitudeColumn],
|
|
253
|
+
]) {
|
|
254
|
+
if (!sourceColumnNames.has(columnName.toLowerCase())) {
|
|
255
|
+
throw new Error(`Point binding ${bindingName} "${columnName}" was not found in source columns.`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (sourceColumnNames.has(geometryColumn.toLowerCase())) {
|
|
259
|
+
throw new Error(`Point binding geometryColumn "${geometryColumn}" conflicts with an existing source column.`);
|
|
260
|
+
}
|
|
261
|
+
const datasetIds = Object.keys(config.datasets);
|
|
262
|
+
let parsedSpec = config.spec;
|
|
263
|
+
if (typeof parsedSpec === 'string') {
|
|
264
|
+
try {
|
|
265
|
+
parsedSpec = JSON.parse(parsedSpec);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Durable resource validation reports the invalid serialized spec.
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const spec = isDeckMapConfigRecord(parsedSpec)
|
|
272
|
+
? {
|
|
273
|
+
...parsedSpec,
|
|
274
|
+
...(Array.isArray(parsedSpec.layers)
|
|
275
|
+
? {
|
|
276
|
+
layers: normalizeDeckMapPointLayers({
|
|
277
|
+
layers: parsedSpec.layers,
|
|
278
|
+
datasetId,
|
|
279
|
+
datasetIds,
|
|
280
|
+
geometryColumn,
|
|
281
|
+
}),
|
|
282
|
+
}
|
|
283
|
+
: {}),
|
|
284
|
+
}
|
|
285
|
+
: parsedSpec;
|
|
286
|
+
let fitToData = config.fitToData;
|
|
287
|
+
if (isDeckMapConfigRecord(fitToData) && fitToData.dataset === datasetId) {
|
|
288
|
+
const geometryFit = { ...fitToData };
|
|
289
|
+
delete geometryFit.longitudeColumn;
|
|
290
|
+
delete geometryFit.latitudeColumn;
|
|
291
|
+
delete geometryFit.geometryColumns;
|
|
292
|
+
delete geometryFit.h3Column;
|
|
293
|
+
fitToData = { ...geometryFit, geometryColumn };
|
|
294
|
+
}
|
|
295
|
+
else if (!fitToData) {
|
|
296
|
+
fitToData = {
|
|
297
|
+
dataset: datasetId,
|
|
298
|
+
geometryColumn,
|
|
299
|
+
padding: 40,
|
|
300
|
+
maxZoom: 12,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
const interaction = config.interaction?.type === 'point-radius-brush' &&
|
|
304
|
+
config.interaction.dataset === datasetId
|
|
305
|
+
? { ...config.interaction, longitudeColumn, latitudeColumn }
|
|
306
|
+
: config.interaction;
|
|
307
|
+
return {
|
|
308
|
+
...config,
|
|
309
|
+
spec,
|
|
310
|
+
...(interaction !== config.interaction ? { interaction } : {}),
|
|
311
|
+
datasets: {
|
|
312
|
+
...config.datasets,
|
|
313
|
+
[datasetId]: {
|
|
314
|
+
...dataset,
|
|
315
|
+
source: {
|
|
316
|
+
tableName: dataset.source.tableName,
|
|
317
|
+
transformSql: createDeckMapPointTransformSql({
|
|
318
|
+
longitudeColumn,
|
|
319
|
+
latitudeColumn,
|
|
320
|
+
geometryColumn,
|
|
321
|
+
}),
|
|
322
|
+
},
|
|
323
|
+
geometryColumn,
|
|
324
|
+
geometryEncodingHint: 'wkb',
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
fitToData,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
220
330
|
/**
|
|
221
331
|
* Post-normalizes an existing Deck map config so table-backed lon/lat datasets
|
|
222
332
|
* without `transformSql`, `sqlQuery`, or a native geometry column get a WKB
|
|
@@ -499,4 +609,38 @@ export function regenerateMapConfigForTable(panel, table, longitudeColumn, latit
|
|
|
499
609
|
fitToData: nextConfig.fitToData ?? existingConfig.fitToData,
|
|
500
610
|
};
|
|
501
611
|
}
|
|
612
|
+
/**
|
|
613
|
+
* Applies a document map table pick: regenerate geospatial config when
|
|
614
|
+
* possible, otherwise retarget the single table-backed dataset.
|
|
615
|
+
*/
|
|
616
|
+
export function applyDeckMapTableSelection(config, table, longitudeColumn, latitudeColumn) {
|
|
617
|
+
const regenerated = regenerateMapConfigForTable({ config }, table, longitudeColumn, latitudeColumn);
|
|
618
|
+
if (regenerated !== config) {
|
|
619
|
+
return regenerated;
|
|
620
|
+
}
|
|
621
|
+
const datasetIds = Object.keys(config.datasets ?? {});
|
|
622
|
+
if (datasetIds.length !== 1)
|
|
623
|
+
return config;
|
|
624
|
+
const datasetId = datasetIds[0];
|
|
625
|
+
const dataset = config.datasets[datasetId];
|
|
626
|
+
if (!dataset || !isDeckMapTableDatasetSource(dataset.source)) {
|
|
627
|
+
return config;
|
|
628
|
+
}
|
|
629
|
+
const tableName = quoteDeckMapSqlTableReference(table.table);
|
|
630
|
+
if (dataset.source.tableName === tableName)
|
|
631
|
+
return config;
|
|
632
|
+
return {
|
|
633
|
+
...config,
|
|
634
|
+
datasets: {
|
|
635
|
+
...config.datasets,
|
|
636
|
+
[datasetId]: {
|
|
637
|
+
...dataset,
|
|
638
|
+
source: {
|
|
639
|
+
...dataset.source,
|
|
640
|
+
tableName,
|
|
641
|
+
},
|
|
642
|
+
},
|
|
643
|
+
},
|
|
644
|
+
};
|
|
645
|
+
}
|
|
502
646
|
//# sourceMappingURL=mapConfigUtils.js.map
|
|
@@ -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 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';\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 ...(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\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"]}
|
package/dist/mapFit.d.ts
CHANGED
|
@@ -37,6 +37,22 @@ export declare function createDeckMapBoundsQuery(options: {
|
|
|
37
37
|
source: DeckMapDatasetSource;
|
|
38
38
|
fitToData: DeckMapFitToDataConfig;
|
|
39
39
|
}): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* MapLibre `jumpTo` options. Omits pitch/bearing unless set so fit preserves
|
|
42
|
+
* a pitched `initialViewState` (needed for extruded columns).
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildDeckMapJumpToOptions(opts: {
|
|
45
|
+
longitude: number;
|
|
46
|
+
latitude: number;
|
|
47
|
+
zoom: number;
|
|
48
|
+
bearing?: number;
|
|
49
|
+
pitch?: number;
|
|
50
|
+
}): {
|
|
51
|
+
center: [number, number];
|
|
52
|
+
zoom: number;
|
|
53
|
+
bearing?: number;
|
|
54
|
+
pitch?: number;
|
|
55
|
+
};
|
|
40
56
|
/**
|
|
41
57
|
* Executes host-neutral fit-to-data requests for a Deck map surface.
|
|
42
58
|
*
|
package/dist/mapFit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapFit.d.ts","sourceRoot":"","sources":["../src/mapFit.ts"],"names":[],"mappings":"AAOA,OAAO,
|
|
1
|
+
{"version":3,"file":"mapFit.d.ts","sourceRoot":"","sources":["../src/mapFit.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAK3E,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AA4BjB;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GACvC,sBAAsB,GAAG,IAAI,CA4F/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,gBAAgB,GAAG,SAAS,GACpC,oBAAoB,GAAG,IAAI,CAU7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,EAAE,sBAAsB,CAAC;CACnC,iBAgHA;AAqED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG;IACF,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAaA;AAoBD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACzC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,QAmLA"}
|