@sqlrooms/deck 0.29.0-rc.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE.md +10 -0
  2. package/README.md +654 -0
  3. package/dist/BlockMapSettings.d.ts +3 -0
  4. package/dist/BlockMapSettings.d.ts.map +1 -0
  5. package/dist/BlockMapSettings.js +57 -0
  6. package/dist/BlockMapSettings.js.map +1 -0
  7. package/dist/DashboardMapSettings.d.ts +7 -0
  8. package/dist/DashboardMapSettings.d.ts.map +1 -0
  9. package/dist/DashboardMapSettings.js +52 -0
  10. package/dist/DashboardMapSettings.js.map +1 -0
  11. package/dist/DeckJsonMap.d.ts +4 -0
  12. package/dist/DeckJsonMap.d.ts.map +1 -0
  13. package/dist/DeckJsonMap.js +370 -0
  14. package/dist/DeckJsonMap.js.map +1 -0
  15. package/dist/DeckJsonMapSpec.d.ts +7617 -0
  16. package/dist/DeckJsonMapSpec.d.ts.map +1 -0
  17. package/dist/DeckJsonMapSpec.js +82 -0
  18. package/dist/DeckJsonMapSpec.js.map +1 -0
  19. package/dist/DeckMapDefaultStylesProvider.d.ts +28 -0
  20. package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -0
  21. package/dist/DeckMapDefaultStylesProvider.js +23 -0
  22. package/dist/DeckMapDefaultStylesProvider.js.map +1 -0
  23. package/dist/DeckMapSurface.d.ts +39 -0
  24. package/dist/DeckMapSurface.d.ts.map +1 -0
  25. package/dist/DeckMapSurface.js +137 -0
  26. package/dist/DeckMapSurface.js.map +1 -0
  27. package/dist/DeckMapsSlice.d.ts +99 -0
  28. package/dist/DeckMapsSlice.d.ts.map +1 -0
  29. package/dist/DeckMapsSlice.js +89 -0
  30. package/dist/DeckMapsSlice.js.map +1 -0
  31. package/dist/MapSettings.d.ts +16 -0
  32. package/dist/MapSettings.d.ts.map +1 -0
  33. package/dist/MapSettings.js +292 -0
  34. package/dist/MapSettings.js.map +1 -0
  35. package/dist/MapSettingsControls.d.ts +40 -0
  36. package/dist/MapSettingsControls.d.ts.map +1 -0
  37. package/dist/MapSettingsControls.js +54 -0
  38. package/dist/MapSettingsControls.js.map +1 -0
  39. package/dist/ai.d.ts +261 -0
  40. package/dist/ai.d.ts.map +1 -0
  41. package/dist/ai.js +392 -0
  42. package/dist/ai.js.map +1 -0
  43. package/dist/block.d.ts +21 -0
  44. package/dist/block.d.ts.map +1 -0
  45. package/dist/block.js +105 -0
  46. package/dist/block.js.map +1 -0
  47. package/dist/blockDocumentRegistration.d.ts +45 -0
  48. package/dist/blockDocumentRegistration.d.ts.map +1 -0
  49. package/dist/blockDocumentRegistration.js +68 -0
  50. package/dist/blockDocumentRegistration.js.map +1 -0
  51. package/dist/createDeckJsonSpecFromDatasets.d.ts +11 -0
  52. package/dist/createDeckJsonSpecFromDatasets.d.ts.map +1 -0
  53. package/dist/createDeckJsonSpecFromDatasets.js +85 -0
  54. package/dist/createDeckJsonSpecFromDatasets.js.map +1 -0
  55. package/dist/createOrUpdateDeckMapResource.d.ts +81 -0
  56. package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -0
  57. package/dist/createOrUpdateDeckMapResource.js +82 -0
  58. package/dist/createOrUpdateDeckMapResource.js.map +1 -0
  59. package/dist/dashboard.d.ts +6 -0
  60. package/dist/dashboard.d.ts.map +1 -0
  61. package/dist/dashboard.js +337 -0
  62. package/dist/dashboard.js.map +1 -0
  63. package/dist/dashboardConfig.d.ts +25 -0
  64. package/dist/dashboardConfig.d.ts.map +1 -0
  65. package/dist/dashboardConfig.js +82 -0
  66. package/dist/dashboardConfig.js.map +1 -0
  67. package/dist/dashboardIntegration.d.ts +3 -0
  68. package/dist/dashboardIntegration.d.ts.map +1 -0
  69. package/dist/dashboardIntegration.js +16 -0
  70. package/dist/dashboardIntegration.js.map +1 -0
  71. package/dist/datasetSourceUtils.d.ts +16 -0
  72. package/dist/datasetSourceUtils.d.ts.map +1 -0
  73. package/dist/datasetSourceUtils.js +25 -0
  74. package/dist/datasetSourceUtils.js.map +1 -0
  75. package/dist/datasets/PreparedDatasetStore.d.ts +120 -0
  76. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -0
  77. package/dist/datasets/PreparedDatasetStore.js +268 -0
  78. package/dist/datasets/PreparedDatasetStore.js.map +1 -0
  79. package/dist/datasets/helpers.d.ts +57 -0
  80. package/dist/datasets/helpers.d.ts.map +1 -0
  81. package/dist/datasets/helpers.js +155 -0
  82. package/dist/datasets/helpers.js.map +1 -0
  83. package/dist/datasets/normalizeDatasets.d.ts +11 -0
  84. package/dist/datasets/normalizeDatasets.d.ts.map +1 -0
  85. package/dist/datasets/normalizeDatasets.js +50 -0
  86. package/dist/datasets/normalizeDatasets.js.map +1 -0
  87. package/dist/datasets/tableAdapter.d.ts +11 -0
  88. package/dist/datasets/tableAdapter.d.ts.map +1 -0
  89. package/dist/datasets/tableAdapter.js +11 -0
  90. package/dist/datasets/tableAdapter.js.map +1 -0
  91. package/dist/datasets/tableDatasetSql.d.ts +16 -0
  92. package/dist/datasets/tableDatasetSql.d.ts.map +1 -0
  93. package/dist/datasets/tableDatasetSql.js +49 -0
  94. package/dist/datasets/tableDatasetSql.js.map +1 -0
  95. package/dist/datasets/types.d.ts +40 -0
  96. package/dist/datasets/types.d.ts.map +1 -0
  97. package/dist/datasets/types.js +2 -0
  98. package/dist/datasets/types.js.map +1 -0
  99. package/dist/datasets/usePreparedDatasetStates.d.ts +16 -0
  100. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -0
  101. package/dist/datasets/usePreparedDatasetStates.js +59 -0
  102. package/dist/datasets/usePreparedDatasetStates.js.map +1 -0
  103. package/dist/index.d.ts +34 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +27 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/json/aggregateWaypoints.d.ts +14 -0
  108. package/dist/json/aggregateWaypoints.d.ts.map +1 -0
  109. package/dist/json/aggregateWaypoints.js +190 -0
  110. package/dist/json/aggregateWaypoints.js.map +1 -0
  111. package/dist/json/colorScaleFunction.d.ts +27 -0
  112. package/dist/json/colorScaleFunction.d.ts.map +1 -0
  113. package/dist/json/colorScaleFunction.js +46 -0
  114. package/dist/json/colorScaleFunction.js.map +1 -0
  115. package/dist/json/compileColorScale.d.ts +12 -0
  116. package/dist/json/compileColorScale.d.ts.map +1 -0
  117. package/dist/json/compileColorScale.js +125 -0
  118. package/dist/json/compileColorScale.js.map +1 -0
  119. package/dist/json/compileGeoArrowAccessor.d.ts +18 -0
  120. package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -0
  121. package/dist/json/compileGeoArrowAccessor.js +129 -0
  122. package/dist/json/compileGeoArrowAccessor.js.map +1 -0
  123. package/dist/json/createDeckJsonConfiguration.d.ts +9 -0
  124. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -0
  125. package/dist/json/createDeckJsonConfiguration.js +315 -0
  126. package/dist/json/createDeckJsonConfiguration.js.map +1 -0
  127. package/dist/json/defaultClasses.d.ts +12 -0
  128. package/dist/json/defaultClasses.d.ts.map +1 -0
  129. package/dist/json/defaultClasses.js +35 -0
  130. package/dist/json/defaultClasses.js.map +1 -0
  131. package/dist/json/extractColorScaleLegends.d.ts +8 -0
  132. package/dist/json/extractColorScaleLegends.d.ts.map +1 -0
  133. package/dist/json/extractColorScaleLegends.js +86 -0
  134. package/dist/json/extractColorScaleLegends.js.map +1 -0
  135. package/dist/json/heatmapDefaults.d.ts +8 -0
  136. package/dist/json/heatmapDefaults.d.ts.map +1 -0
  137. package/dist/json/heatmapDefaults.js +14 -0
  138. package/dist/json/heatmapDefaults.js.map +1 -0
  139. package/dist/json/layerCompatibility.d.ts +21 -0
  140. package/dist/json/layerCompatibility.d.ts.map +1 -0
  141. package/dist/json/layerCompatibility.js +168 -0
  142. package/dist/json/layerCompatibility.js.map +1 -0
  143. package/dist/json/layerConfig.d.ts +14 -0
  144. package/dist/json/layerConfig.d.ts.map +1 -0
  145. package/dist/json/layerConfig.js +54 -0
  146. package/dist/json/layerConfig.js.map +1 -0
  147. package/dist/json/layers/DeckColumnLayer.d.ts +10 -0
  148. package/dist/json/layers/DeckColumnLayer.d.ts.map +1 -0
  149. package/dist/json/layers/DeckColumnLayer.js +26 -0
  150. package/dist/json/layers/DeckColumnLayer.js.map +1 -0
  151. package/dist/json/layers/DeckH3HexagonLayer.d.ts +37 -0
  152. package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -0
  153. package/dist/json/layers/DeckH3HexagonLayer.js +118 -0
  154. package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -0
  155. package/dist/json/layers/DeckTripsLayer.d.ts +46 -0
  156. package/dist/json/layers/DeckTripsLayer.d.ts.map +1 -0
  157. package/dist/json/layers/DeckTripsLayer.js +170 -0
  158. package/dist/json/layers/DeckTripsLayer.js.map +1 -0
  159. package/dist/json/layers/createTableToRecordBatchAdapter.d.ts +20 -0
  160. package/dist/json/layers/createTableToRecordBatchAdapter.d.ts.map +1 -0
  161. package/dist/json/layers/createTableToRecordBatchAdapter.js +81 -0
  162. package/dist/json/layers/createTableToRecordBatchAdapter.js.map +1 -0
  163. package/dist/json/layers/index.d.ts +5 -0
  164. package/dist/json/layers/index.d.ts.map +1 -0
  165. package/dist/json/layers/index.js +5 -0
  166. package/dist/json/layers/index.js.map +1 -0
  167. package/dist/json/rewriteGeoArrowAccessors.d.ts +7 -0
  168. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -0
  169. package/dist/json/rewriteGeoArrowAccessors.js +55 -0
  170. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -0
  171. package/dist/mapAiConfig.d.ts +111 -0
  172. package/dist/mapAiConfig.d.ts.map +1 -0
  173. package/dist/mapAiConfig.js +69 -0
  174. package/dist/mapAiConfig.js.map +1 -0
  175. package/dist/mapConfig.d.ts +73 -0
  176. package/dist/mapConfig.d.ts.map +1 -0
  177. package/dist/mapConfig.js +47 -0
  178. package/dist/mapConfig.js.map +1 -0
  179. package/dist/mapConfigUtils.d.ts +111 -0
  180. package/dist/mapConfigUtils.d.ts.map +1 -0
  181. package/dist/mapConfigUtils.js +502 -0
  182. package/dist/mapConfigUtils.js.map +1 -0
  183. package/dist/mapDataPolicy.d.ts +9 -0
  184. package/dist/mapDataPolicy.d.ts.map +1 -0
  185. package/dist/mapDataPolicy.js +25 -0
  186. package/dist/mapDataPolicy.js.map +1 -0
  187. package/dist/mapFit.d.ts +62 -0
  188. package/dist/mapFit.d.ts.map +1 -0
  189. package/dist/mapFit.js +325 -0
  190. package/dist/mapFit.js.map +1 -0
  191. package/dist/mapLayerConfigUtils.d.ts +54 -0
  192. package/dist/mapLayerConfigUtils.d.ts.map +1 -0
  193. package/dist/mapLayerConfigUtils.js +296 -0
  194. package/dist/mapLayerConfigUtils.js.map +1 -0
  195. package/dist/mapResourceAuthoring.d.ts +40 -0
  196. package/dist/mapResourceAuthoring.d.ts.map +1 -0
  197. package/dist/mapResourceAuthoring.js +266 -0
  198. package/dist/mapResourceAuthoring.js.map +1 -0
  199. package/dist/mosaic.d.ts +9 -0
  200. package/dist/mosaic.d.ts.map +1 -0
  201. package/dist/mosaic.js +8 -0
  202. package/dist/mosaic.js.map +1 -0
  203. package/dist/prepare/detectGeometryColumn.d.ts +19 -0
  204. package/dist/prepare/detectGeometryColumn.d.ts.map +1 -0
  205. package/dist/prepare/detectGeometryColumn.js +126 -0
  206. package/dist/prepare/detectGeometryColumn.js.map +1 -0
  207. package/dist/prepare/geoarrow.d.ts +18 -0
  208. package/dist/prepare/geoarrow.d.ts.map +1 -0
  209. package/dist/prepare/geoarrow.js +114 -0
  210. package/dist/prepare/geoarrow.js.map +1 -0
  211. package/dist/prepare/geometryDecoder.d.ts +8 -0
  212. package/dist/prepare/geometryDecoder.d.ts.map +1 -0
  213. package/dist/prepare/geometryDecoder.js +2 -0
  214. package/dist/prepare/geometryDecoder.js.map +1 -0
  215. package/dist/prepare/prepareDeckDataset.d.ts +57 -0
  216. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -0
  217. package/dist/prepare/prepareDeckDataset.js +112 -0
  218. package/dist/prepare/prepareDeckDataset.js.map +1 -0
  219. package/dist/prepare/toGeoJsonBinary.d.ts +9 -0
  220. package/dist/prepare/toGeoJsonBinary.d.ts.map +1 -0
  221. package/dist/prepare/toGeoJsonBinary.js +26 -0
  222. package/dist/prepare/toGeoJsonBinary.js.map +1 -0
  223. package/dist/prepare/types.d.ts +25 -0
  224. package/dist/prepare/types.d.ts.map +1 -0
  225. package/dist/prepare/types.js +2 -0
  226. package/dist/prepare/types.js.map +1 -0
  227. package/dist/prepare/wkbDecoder.d.ts +3 -0
  228. package/dist/prepare/wkbDecoder.d.ts.map +1 -0
  229. package/dist/prepare/wkbDecoder.js +419 -0
  230. package/dist/prepare/wkbDecoder.js.map +1 -0
  231. package/dist/prepare/wkbParser.d.ts +24 -0
  232. package/dist/prepare/wkbParser.d.ts.map +1 -0
  233. package/dist/prepare/wkbParser.js +139 -0
  234. package/dist/prepare/wkbParser.js.map +1 -0
  235. package/dist/types.d.ts +92 -0
  236. package/dist/types.d.ts.map +1 -0
  237. package/dist/types.js +11 -0
  238. package/dist/types.js.map +1 -0
  239. package/dist/useDeckMapDatasetSchema.d.ts +33 -0
  240. package/dist/useDeckMapDatasetSchema.d.ts.map +1 -0
  241. package/dist/useDeckMapDatasetSchema.js +138 -0
  242. package/dist/useDeckMapDatasetSchema.js.map +1 -0
  243. package/dist/useDeckMapDatasets.d.ts +17 -0
  244. package/dist/useDeckMapDatasets.d.ts.map +1 -0
  245. package/dist/useDeckMapDatasets.js +69 -0
  246. package/dist/useDeckMapDatasets.js.map +1 -0
  247. package/dist/useDeckMapFitToBounds.d.ts +31 -0
  248. package/dist/useDeckMapFitToBounds.d.ts.map +1 -0
  249. package/dist/useDeckMapFitToBounds.js +58 -0
  250. package/dist/useDeckMapFitToBounds.js.map +1 -0
  251. package/package.json +98 -0
@@ -0,0 +1,502 @@
1
+ import { getRawSqlTableReference, makeQualifiedTableName, quoteParsedRawSqlTableReference, } from '@sqlrooms/duckdb';
2
+ import { createDeckMapDashboardPanelConfig, } from './mapConfig';
3
+ import { DECK_TABLE_DATASET_SOURCE_RELATION } from './datasets/tableDatasetSql';
4
+ const LONGITUDE_COLUMN_NAMES = ['longitude', 'lon', 'lng', 'long', 'x'];
5
+ const LATITUDE_COLUMN_NAMES = ['latitude', 'lat', 'y'];
6
+ const GEOMETRY_COLUMN_NAMES = ['geometry', 'geom'];
7
+ const DEFAULT_GEOMETRY_COLUMN = '__sqlrooms_geom';
8
+ const DEFAULT_FILL_COLOR = [56, 189, 248, 180];
9
+ function isRecord(value) {
10
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value));
11
+ }
12
+ function updateDeckMapGeometryColumnBindings(config, datasetId, geometryColumn) {
13
+ if (!geometryColumn || !isRecord(config.spec))
14
+ return config;
15
+ const layers = config.spec.layers;
16
+ if (!Array.isArray(layers))
17
+ return config;
18
+ let changed = false;
19
+ const nextLayers = layers.map((layer) => {
20
+ if (!isRecord(layer) || !isRecord(layer._sqlroomsBinding))
21
+ return layer;
22
+ const binding = layer._sqlroomsBinding;
23
+ if (binding.dataset !== datasetId ||
24
+ typeof binding.geometryColumn !== 'string') {
25
+ return layer;
26
+ }
27
+ changed = true;
28
+ return {
29
+ ...layer,
30
+ _sqlroomsBinding: { ...binding, geometryColumn },
31
+ };
32
+ });
33
+ return changed
34
+ ? { ...config, spec: { ...config.spec, layers: nextLayers } }
35
+ : config;
36
+ }
37
+ function findColumnByName(columns, candidates) {
38
+ const candidateSet = new Set(candidates);
39
+ return columns.find((column) => candidateSet.has(column.name.toLowerCase()))
40
+ ?.name;
41
+ }
42
+ function resolveDeckMapCoordinateColumnNames(options) {
43
+ const longitudeColumn = options.longitudeColumn ||
44
+ findColumnByName(options.columns, LONGITUDE_COLUMN_NAMES);
45
+ const latitudeColumn = options.latitudeColumn ||
46
+ findColumnByName(options.columns, LATITUDE_COLUMN_NAMES);
47
+ return longitudeColumn && latitudeColumn
48
+ ? { longitudeColumn, latitudeColumn }
49
+ : null;
50
+ }
51
+ export function findDeckMapLongitudeLatitudeColumns(columns) {
52
+ if (!columns)
53
+ return null;
54
+ return resolveDeckMapCoordinateColumnNames({ columns });
55
+ }
56
+ export function findLongitudeLatitudeColumns(table) {
57
+ if (!table)
58
+ return null;
59
+ return findDeckMapLongitudeLatitudeColumns(table.columns);
60
+ }
61
+ function inferGeometryEncodingHint(column) {
62
+ const type = column.type?.toLowerCase();
63
+ if (!type)
64
+ return undefined;
65
+ if (type.includes('wkb') ||
66
+ type.includes('blob') ||
67
+ type.includes('binary')) {
68
+ return 'wkb';
69
+ }
70
+ if (type.includes('wkt') ||
71
+ type.includes('varchar') ||
72
+ type.includes('text')) {
73
+ return 'wkt';
74
+ }
75
+ return undefined;
76
+ }
77
+ export function findDeckMapGeometryColumn(columns) {
78
+ if (!columns)
79
+ return null;
80
+ const namedGeometryColumn = findColumnByName(columns, GEOMETRY_COLUMN_NAMES);
81
+ const geometryColumn = (namedGeometryColumn
82
+ ? columns.find((column) => column.name === namedGeometryColumn)
83
+ : undefined) ??
84
+ columns.find((column) => {
85
+ const type = column.type?.toLowerCase() ?? '';
86
+ return type.includes('geometry') || type.includes('geoarrow');
87
+ });
88
+ if (!geometryColumn)
89
+ return null;
90
+ return {
91
+ geometryColumn: geometryColumn.name,
92
+ geometryEncodingHint: inferGeometryEncodingHint(geometryColumn),
93
+ };
94
+ }
95
+ export function findGeometryColumn(table) {
96
+ if (!table)
97
+ return null;
98
+ return findDeckMapGeometryColumn(table.columns);
99
+ }
100
+ export function quoteDeckMapSqlIdentifier(identifier) {
101
+ return `"${identifier.replace(/"/g, '""')}"`;
102
+ }
103
+ export function quoteDeckMapSqlTableReference(tableReference) {
104
+ if (typeof tableReference === 'string') {
105
+ const rawSqlTableReference = quoteParsedRawSqlTableReference(tableReference);
106
+ if (!rawSqlTableReference) {
107
+ throw new Error(`Invalid deck map table reference "${tableReference}".`);
108
+ }
109
+ return rawSqlTableReference;
110
+ }
111
+ if (!tableReference.table) {
112
+ throw new Error('Deck map table reference object requires a table name.');
113
+ }
114
+ return getRawSqlTableReference(makeQualifiedTableName({
115
+ database: tableReference.database,
116
+ schema: tableReference.schema,
117
+ table: tableReference.table,
118
+ }));
119
+ }
120
+ function ensureDeckMapColumnExists(columns, columnName, role) {
121
+ if (!columns.some((column) => column.name === columnName)) {
122
+ throw new Error(`Unknown ${role} column "${columnName}". Available columns: ${columns
123
+ .map((column) => column.name)
124
+ .join(', ')}.`);
125
+ }
126
+ }
127
+ function resolveDeckMapCoordinateColumns(options) {
128
+ const coordinates = options.longitudeColumn && options.latitudeColumn
129
+ ? {
130
+ longitudeColumn: options.longitudeColumn,
131
+ latitudeColumn: options.latitudeColumn,
132
+ }
133
+ : findDeckMapLongitudeLatitudeColumns(options.columns);
134
+ if (!coordinates) {
135
+ throw new Error('Could not find longitude/latitude columns. Pass longitudeColumn and latitudeColumn explicitly, or provide geometryColumn.');
136
+ }
137
+ ensureDeckMapColumnExists(options.columns, coordinates.longitudeColumn, 'longitude');
138
+ ensureDeckMapColumnExists(options.columns, coordinates.latitudeColumn, 'latitude');
139
+ return coordinates;
140
+ }
141
+ function createDeckMapPointSourceSql(options) {
142
+ const quotedLongitude = quoteDeckMapSqlIdentifier(options.longitudeColumn);
143
+ const quotedLatitude = quoteDeckMapSqlIdentifier(options.latitudeColumn);
144
+ const cleanedSourceSqlQuery = options.sourceSqlQuery
145
+ ?.trim()
146
+ .replace(/(?:\s*;+\s*)+$/, '');
147
+ const baseSource = cleanedSourceSqlQuery
148
+ ? `(${cleanedSourceSqlQuery}) AS "__sqlrooms_dashboard_map_source"`
149
+ : quoteDeckMapSqlTableReference(options.tableReference);
150
+ return [
151
+ `SELECT *, ST_AsWKB(ST_Point(${quotedLongitude}, ${quotedLatitude})) AS ${quoteDeckMapSqlIdentifier(options.geometryColumn)}`,
152
+ `FROM ${baseSource}`,
153
+ `WHERE ${quotedLongitude} IS NOT NULL AND ${quotedLatitude} IS NOT NULL`,
154
+ ].join(' ');
155
+ }
156
+ /**
157
+ * Builds the standard lon/lat → WKB point transform SQL used by Deck map
158
+ * datasets that follow the selected table via {@link DECK_TABLE_DATASET_SOURCE_RELATION}.
159
+ */
160
+ export function createDeckMapPointTransformSql(options) {
161
+ const quotedLongitude = quoteDeckMapSqlIdentifier(options.longitudeColumn);
162
+ const quotedLatitude = quoteDeckMapSqlIdentifier(options.latitudeColumn);
163
+ return [
164
+ `SELECT *, ST_AsWKB(ST_Point(${quotedLongitude}, ${quotedLatitude})) AS ${quoteDeckMapSqlIdentifier(options.geometryColumn)}`,
165
+ `FROM ${DECK_TABLE_DATASET_SOURCE_RELATION}`,
166
+ `WHERE ${quotedLongitude} IS NOT NULL AND ${quotedLatitude} IS NOT NULL`,
167
+ ].join(' ');
168
+ }
169
+ const DECK_MAP_POINT_LAYER_TYPES = new Set([
170
+ 'GeoArrowScatterplotLayer',
171
+ 'GeoArrowHeatmapLayer',
172
+ 'GeoArrowColumnLayer',
173
+ ]);
174
+ function isDeckMapConfigRecord(value) {
175
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value));
176
+ }
177
+ function deckMapLayerTargetsDataset(options) {
178
+ const binding = isDeckMapConfigRecord(options.layer._sqlroomsBinding)
179
+ ? options.layer._sqlroomsBinding
180
+ : undefined;
181
+ const boundDataset = binding?.dataset;
182
+ if (typeof boundDataset === 'string') {
183
+ return boundDataset === options.datasetId;
184
+ }
185
+ return options.datasetIds.length === 1 && options.layer.data === undefined;
186
+ }
187
+ function normalizeDeckMapPointLayers(options) {
188
+ let changed = false;
189
+ const layers = options.layers.map((layer) => {
190
+ if (!isDeckMapConfigRecord(layer)) {
191
+ return layer;
192
+ }
193
+ const layerType = layer['@@type'];
194
+ if (typeof layerType !== 'string' ||
195
+ !DECK_MAP_POINT_LAYER_TYPES.has(layerType) ||
196
+ !deckMapLayerTargetsDataset({
197
+ layer,
198
+ datasetId: options.datasetId,
199
+ datasetIds: options.datasetIds,
200
+ })) {
201
+ return layer;
202
+ }
203
+ changed = true;
204
+ const binding = isDeckMapConfigRecord(layer._sqlroomsBinding)
205
+ ? layer._sqlroomsBinding
206
+ : {};
207
+ return {
208
+ ...layer,
209
+ _sqlroomsBinding: {
210
+ ...binding,
211
+ dataset: typeof binding.dataset === 'string'
212
+ ? binding.dataset
213
+ : options.datasetId,
214
+ geometryColumn: options.geometryColumn,
215
+ },
216
+ };
217
+ });
218
+ return (changed ? layers : options.layers);
219
+ }
220
+ /**
221
+ * Post-normalizes an existing Deck map config so table-backed lon/lat datasets
222
+ * without `transformSql`, `sqlQuery`, or a native geometry column get a WKB
223
+ * point transform, geometry bindings, and `fitToData.geometryColumn` alignment.
224
+ *
225
+ * Prefer this for AI/tool configs that arrive without a transform. Fresh configs
226
+ * from {@link createDeckMapDashboardConfigForTable} already include the transform;
227
+ * this helper patches in place without rebuilding layers.
228
+ */
229
+ export function normalizeDeckMapPointConfig(options) {
230
+ const { config, resolveTable } = options;
231
+ const datasets = isDeckMapConfigRecord(config.datasets)
232
+ ? config.datasets
233
+ : undefined;
234
+ if (!datasets) {
235
+ return config;
236
+ }
237
+ const datasetIds = Object.keys(datasets);
238
+ let nextDatasets = datasets;
239
+ let nextSpec = config.spec;
240
+ let nextFitToData = config.fitToData;
241
+ let changed = false;
242
+ for (const [datasetId, datasetValue] of Object.entries(datasets)) {
243
+ if (!isDeckMapConfigRecord(datasetValue)) {
244
+ continue;
245
+ }
246
+ const dataset = datasetValue;
247
+ const source = isDeckMapConfigRecord(dataset.source)
248
+ ? dataset.source
249
+ : undefined;
250
+ const tableName = typeof source?.tableName === 'string' ? source.tableName : undefined;
251
+ const configuredGeometryColumn = typeof dataset.geometryColumn === 'string'
252
+ ? dataset.geometryColumn.trim()
253
+ : undefined;
254
+ if (!tableName ||
255
+ source?.sqlQuery ||
256
+ source?.transformSql ||
257
+ (configuredGeometryColumn &&
258
+ configuredGeometryColumn !== DEFAULT_GEOMETRY_COLUMN)) {
259
+ continue;
260
+ }
261
+ const table = resolveTable(tableName);
262
+ if (configuredGeometryColumn === DEFAULT_GEOMETRY_COLUMN &&
263
+ table?.columns.some((column) => column.name === configuredGeometryColumn)) {
264
+ continue;
265
+ }
266
+ if (findGeometryColumn(table)) {
267
+ continue;
268
+ }
269
+ const coordinateColumns = findLongitudeLatitudeColumns(table);
270
+ if (!coordinateColumns) {
271
+ continue;
272
+ }
273
+ const geometryColumn = DEFAULT_GEOMETRY_COLUMN;
274
+ nextDatasets = {
275
+ ...nextDatasets,
276
+ [datasetId]: {
277
+ ...dataset,
278
+ source: {
279
+ ...source,
280
+ tableName,
281
+ transformSql: createDeckMapPointTransformSql({
282
+ ...coordinateColumns,
283
+ geometryColumn,
284
+ }),
285
+ },
286
+ geometryColumn,
287
+ geometryEncodingHint: 'wkb',
288
+ },
289
+ };
290
+ if (isDeckMapConfigRecord(nextSpec) &&
291
+ Array.isArray(nextSpec.layers) &&
292
+ nextSpec.layers.length > 0) {
293
+ nextSpec = {
294
+ ...nextSpec,
295
+ layers: normalizeDeckMapPointLayers({
296
+ layers: nextSpec.layers,
297
+ datasetId,
298
+ datasetIds,
299
+ geometryColumn,
300
+ }),
301
+ };
302
+ }
303
+ nextFitToData =
304
+ isDeckMapConfigRecord(nextFitToData) &&
305
+ nextFitToData.dataset === datasetId
306
+ ? {
307
+ ...nextFitToData,
308
+ geometryColumn,
309
+ }
310
+ : (nextFitToData ?? {
311
+ dataset: datasetId,
312
+ geometryColumn,
313
+ padding: 40,
314
+ maxZoom: 12,
315
+ });
316
+ changed = true;
317
+ }
318
+ if (!changed) {
319
+ return config;
320
+ }
321
+ return {
322
+ ...config,
323
+ spec: nextSpec,
324
+ datasets: nextDatasets,
325
+ fitToData: nextFitToData,
326
+ };
327
+ }
328
+ export function normalizeDeckMapFillColor(fillColor) {
329
+ if (fillColor?.length === 3) {
330
+ return [fillColor[0], fillColor[1], fillColor[2]];
331
+ }
332
+ if (fillColor?.length === 4) {
333
+ return [fillColor[0], fillColor[1], fillColor[2], fillColor[3]];
334
+ }
335
+ return [...DEFAULT_FILL_COLOR];
336
+ }
337
+ export function createDeckMapConfigForTable(options) {
338
+ const datasetId = options.tableName;
339
+ const explicitGeometryColumn = options.geometryColumn?.trim() || undefined;
340
+ const detectedCoordinates = options.longitudeColumn && options.latitudeColumn
341
+ ? {
342
+ longitudeColumn: options.longitudeColumn,
343
+ latitudeColumn: options.latitudeColumn,
344
+ }
345
+ : findDeckMapLongitudeLatitudeColumns(options.columns);
346
+ const detectedGeometryColumn = explicitGeometryColumn
347
+ ? {
348
+ geometryColumn: explicitGeometryColumn,
349
+ geometryEncodingHint: options.geometryEncodingHint,
350
+ }
351
+ : detectedCoordinates
352
+ ? null
353
+ : findDeckMapGeometryColumn(options.columns);
354
+ const coordinates = detectedGeometryColumn
355
+ ? undefined
356
+ : resolveDeckMapCoordinateColumns({
357
+ columns: options.columns,
358
+ longitudeColumn: options.longitudeColumn,
359
+ latitudeColumn: options.latitudeColumn,
360
+ });
361
+ const geometryColumn = detectedGeometryColumn?.geometryColumn ?? DEFAULT_GEOMETRY_COLUMN;
362
+ const geometryEncodingHint = options.geometryEncodingHint ??
363
+ detectedGeometryColumn?.geometryEncodingHint;
364
+ const source = coordinates
365
+ ? options.sourceSqlQuery
366
+ ? {
367
+ sqlQuery: createDeckMapPointSourceSql({
368
+ sourceSqlQuery: options.sourceSqlQuery,
369
+ tableReference: options.tableReference ?? options.tableName,
370
+ longitudeColumn: coordinates.longitudeColumn,
371
+ latitudeColumn: coordinates.latitudeColumn,
372
+ geometryColumn,
373
+ }),
374
+ }
375
+ : {
376
+ tableName: options.tableReference
377
+ ? quoteDeckMapSqlTableReference(options.tableReference)
378
+ : options.tableName,
379
+ transformSql: createDeckMapPointTransformSql({
380
+ longitudeColumn: coordinates.longitudeColumn,
381
+ latitudeColumn: coordinates.latitudeColumn,
382
+ geometryColumn,
383
+ }),
384
+ }
385
+ : options.sourceSqlQuery
386
+ ? { sqlQuery: options.sourceSqlQuery }
387
+ : { tableName: options.tableName };
388
+ if (detectedGeometryColumn) {
389
+ ensureDeckMapColumnExists(options.columns, detectedGeometryColumn.geometryColumn, 'geometry');
390
+ }
391
+ return {
392
+ spec: {
393
+ initialViewState: { longitude: 0, latitude: 20, zoom: 1.5 },
394
+ layers: [
395
+ {
396
+ '@@type': coordinates
397
+ ? 'GeoArrowScatterplotLayer'
398
+ : 'GeoArrowPolygonLayer',
399
+ id: datasetId,
400
+ _sqlroomsBinding: {
401
+ dataset: datasetId,
402
+ ...(detectedGeometryColumn
403
+ ? { geometryColumn: detectedGeometryColumn.geometryColumn }
404
+ : {}),
405
+ },
406
+ filled: true,
407
+ stroked: false,
408
+ pickable: true,
409
+ radiusUnits: 'pixels',
410
+ getRadius: options.pointRadius ?? 4,
411
+ getFillColor: options.fillColor ?? [...DEFAULT_FILL_COLOR],
412
+ },
413
+ ],
414
+ },
415
+ datasets: {
416
+ [datasetId]: {
417
+ source,
418
+ geometryColumn,
419
+ geometryEncodingHint: coordinates ? 'wkb' : geometryEncodingHint,
420
+ },
421
+ },
422
+ ...(coordinates
423
+ ? {
424
+ fitToData: {
425
+ dataset: datasetId,
426
+ longitudeColumn: coordinates.longitudeColumn,
427
+ latitudeColumn: coordinates.latitudeColumn,
428
+ padding: 40,
429
+ maxZoom: 12,
430
+ },
431
+ }
432
+ : detectedGeometryColumn
433
+ ? {
434
+ fitToData: {
435
+ dataset: datasetId,
436
+ geometryColumn: detectedGeometryColumn.geometryColumn,
437
+ padding: 40,
438
+ maxZoom: 12,
439
+ },
440
+ }
441
+ : {}),
442
+ ...(options.mapStyle ? { mapStyle: options.mapStyle } : {}),
443
+ };
444
+ }
445
+ export const createDeckMapDashboardConfigForTable = createDeckMapConfigForTable;
446
+ export function createDeckMapDashboardPanelConfigForTable(options) {
447
+ return createDeckMapDashboardPanelConfig({
448
+ title: options.title,
449
+ ...createDeckMapConfigForTable(options),
450
+ });
451
+ }
452
+ /**
453
+ * Regenerates a map's dataset source and fit configuration for a table while
454
+ * preserving an existing single dataset ID so retained layer bindings remain
455
+ * valid. Empty maps adopt the generated dataset and layer spec. Returns the
456
+ * existing config unchanged when the table has no supported geospatial columns
457
+ * or when multiple datasets make the target ambiguous.
458
+ */
459
+ export function regenerateMapConfigForTable(panel, table, longitudeColumn, latitudeColumn) {
460
+ const coordinateColumns = resolveDeckMapCoordinateColumnNames({
461
+ columns: table.columns,
462
+ longitudeColumn,
463
+ latitudeColumn,
464
+ });
465
+ if (!coordinateColumns && !findGeometryColumn(table)) {
466
+ return panel.config;
467
+ }
468
+ const existingConfig = panel.config;
469
+ const existingDatasetIds = Object.keys(existingConfig.datasets ?? {});
470
+ if (existingDatasetIds.length > 1)
471
+ return panel.config;
472
+ const nextConfig = createDeckMapConfigForTable({
473
+ tableName: table.tableName,
474
+ columns: table.columns,
475
+ tableReference: table.table,
476
+ longitudeColumn: coordinateColumns?.longitudeColumn,
477
+ latitudeColumn: coordinateColumns?.latitudeColumn,
478
+ });
479
+ const nextDataset = Object.values(nextConfig.datasets)[0];
480
+ if (existingDatasetIds.length === 0) {
481
+ return nextConfig;
482
+ }
483
+ if (existingDatasetIds.length === 1 && nextDataset) {
484
+ const datasetId = existingDatasetIds[0];
485
+ return updateDeckMapGeometryColumnBindings({
486
+ ...existingConfig,
487
+ datasets: { [datasetId]: nextDataset },
488
+ fitToData: nextConfig.fitToData
489
+ ? { ...nextConfig.fitToData, dataset: datasetId }
490
+ : existingConfig.fitToData,
491
+ }, datasetId, nextDataset.geometryColumn);
492
+ }
493
+ // Preserve existing layer spec (layer types, styling, bindings) — only
494
+ // update the dataset source and fitToData so the data re-fetches with the
495
+ // new coordinate columns.
496
+ return {
497
+ ...existingConfig,
498
+ datasets: nextConfig.datasets,
499
+ fitToData: nextConfig.fitToData ?? existingConfig.fitToData,
500
+ };
501
+ }
502
+ //# sourceMappingURL=mapConfigUtils.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,9 @@
1
+ import { type DeckMapConfig } from './mapConfig';
2
+ /** Resolved runtime row-limit policy applied when loading map datasets. */
3
+ export type DeckMapDataPolicy = {
4
+ disabled?: boolean;
5
+ maxRows: number;
6
+ reason: string;
7
+ };
8
+ export declare function getDeckMapDataPolicy(config: DeckMapConfig | null | undefined): DeckMapDataPolicy;
9
+ //# sourceMappingURL=mapDataPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapDataPolicy.d.ts","sourceRoot":"","sources":["../src/mapDataPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,aAAa,CAAC;AAErB,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAyBF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GACvC,iBAAiB,CAQnB"}
@@ -0,0 +1,25 @@
1
+ import { DEFAULT_DECK_MAP_MAX_DATA_POINTS, } from './mapConfig';
2
+ const DEFAULT_DECK_MAP_DATA_POLICY_REASON = 'Map panels render source rows as interactive deck.gl features. Filter, aggregate, or switch to a smaller source query before rendering this map.';
3
+ function applyDeckMapDataPolicyOverride(basePolicy, override) {
4
+ if (!override) {
5
+ return basePolicy;
6
+ }
7
+ if (override.disabled) {
8
+ return {
9
+ ...basePolicy,
10
+ disabled: true,
11
+ };
12
+ }
13
+ return {
14
+ ...basePolicy,
15
+ ...(override.maxRows !== undefined ? { maxRows: override.maxRows } : {}),
16
+ ...(override.reason !== undefined ? { reason: override.reason } : {}),
17
+ };
18
+ }
19
+ export function getDeckMapDataPolicy(config) {
20
+ return applyDeckMapDataPolicyOverride({
21
+ maxRows: DEFAULT_DECK_MAP_MAX_DATA_POINTS,
22
+ reason: DEFAULT_DECK_MAP_DATA_POLICY_REASON,
23
+ }, config?.dataPolicy);
24
+ }
25
+ //# sourceMappingURL=mapDataPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapDataPolicy.js","sourceRoot":"","sources":["../src/mapDataPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,GAGjC,MAAM,aAAa,CAAC;AASrB,MAAM,mCAAmC,GACvC,kJAAkJ,CAAC;AAErJ,SAAS,8BAA8B,CACrC,UAA6B,EAC7B,QAA+C;IAE/C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO;YACL,GAAG,UAAU;YACb,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,UAAU;QACb,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAwC;IAExC,OAAO,8BAA8B,CACnC;QACE,OAAO,EAAE,gCAAgC;QACzC,MAAM,EAAE,mCAAmC;KAC5C,EACD,MAAM,EAAE,UAAU,CACnB,CAAC;AACJ,CAAC","sourcesContent":["import {\n DEFAULT_DECK_MAP_MAX_DATA_POINTS,\n type DeckMapConfig,\n type DeckMapDataPolicyOverride,\n} from './mapConfig';\n\n/** Resolved runtime row-limit policy applied when loading map datasets. */\nexport type DeckMapDataPolicy = {\n disabled?: boolean;\n maxRows: number;\n reason: string;\n};\n\nconst DEFAULT_DECK_MAP_DATA_POLICY_REASON =\n 'Map panels render source rows as interactive deck.gl features. Filter, aggregate, or switch to a smaller source query before rendering this map.';\n\nfunction applyDeckMapDataPolicyOverride(\n basePolicy: DeckMapDataPolicy,\n override: DeckMapDataPolicyOverride | undefined,\n): DeckMapDataPolicy {\n if (!override) {\n return basePolicy;\n }\n if (override.disabled) {\n return {\n ...basePolicy,\n disabled: true,\n };\n }\n return {\n ...basePolicy,\n ...(override.maxRows !== undefined ? {maxRows: override.maxRows} : {}),\n ...(override.reason !== undefined ? {reason: override.reason} : {}),\n };\n}\n\nexport function getDeckMapDataPolicy(\n config: DeckMapConfig | null | undefined,\n): DeckMapDataPolicy {\n return applyDeckMapDataPolicyOverride(\n {\n maxRows: DEFAULT_DECK_MAP_MAX_DATA_POINTS,\n reason: DEFAULT_DECK_MAP_DATA_POLICY_REASON,\n },\n config?.dataPolicy,\n );\n}\n"]}