@sqlrooms/deck 0.29.0-rc.8 → 0.29.0-rc.9

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 (107) hide show
  1. package/README.md +31 -6
  2. package/dist/DeckJsonMap.d.ts +2 -2
  3. package/dist/DeckJsonMap.d.ts.map +1 -1
  4. package/dist/DeckJsonMap.js +202 -19
  5. package/dist/DeckJsonMap.js.map +1 -1
  6. package/dist/DeckJsonMapSpec.d.ts +36 -36
  7. package/dist/DeckJsonMapSpec.d.ts.map +1 -1
  8. package/dist/DeckJsonMapSpec.js +1 -0
  9. package/dist/DeckJsonMapSpec.js.map +1 -1
  10. package/dist/MapSettings.d.ts.map +1 -1
  11. package/dist/MapSettings.js +202 -25
  12. package/dist/MapSettings.js.map +1 -1
  13. package/dist/ai.d.ts +55 -8
  14. package/dist/ai.d.ts.map +1 -1
  15. package/dist/ai.js +190 -41
  16. package/dist/ai.js.map +1 -1
  17. package/dist/block.d.ts +20 -0
  18. package/dist/block.d.ts.map +1 -0
  19. package/dist/block.js +119 -0
  20. package/dist/block.js.map +1 -0
  21. package/dist/dashboard.d.ts +2 -8
  22. package/dist/dashboard.d.ts.map +1 -1
  23. package/dist/dashboard.js +194 -289
  24. package/dist/dashboard.js.map +1 -1
  25. package/dist/dashboardConfig.d.ts +11 -3
  26. package/dist/dashboardConfig.d.ts.map +1 -1
  27. package/dist/dashboardConfig.js +82 -7
  28. package/dist/dashboardConfig.js.map +1 -1
  29. package/dist/index.d.ts +4 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +3 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/json/aggregateWaypoints.d.ts +14 -0
  34. package/dist/json/aggregateWaypoints.d.ts.map +1 -0
  35. package/dist/json/aggregateWaypoints.js +190 -0
  36. package/dist/json/aggregateWaypoints.js.map +1 -0
  37. package/dist/json/compileColorScale.d.ts +1 -1
  38. package/dist/json/compileColorScale.d.ts.map +1 -1
  39. package/dist/json/compileColorScale.js +42 -20
  40. package/dist/json/compileColorScale.js.map +1 -1
  41. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
  42. package/dist/json/createDeckJsonConfiguration.js +106 -8
  43. package/dist/json/createDeckJsonConfiguration.js.map +1 -1
  44. package/dist/json/defaultClasses.d.ts +5 -4
  45. package/dist/json/defaultClasses.d.ts.map +1 -1
  46. package/dist/json/defaultClasses.js +9 -4
  47. package/dist/json/defaultClasses.js.map +1 -1
  48. package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
  49. package/dist/json/extractColorScaleLegends.js +43 -5
  50. package/dist/json/extractColorScaleLegends.js.map +1 -1
  51. package/dist/json/heatmapDefaults.d.ts +8 -0
  52. package/dist/json/heatmapDefaults.d.ts.map +1 -0
  53. package/dist/json/heatmapDefaults.js +14 -0
  54. package/dist/json/heatmapDefaults.js.map +1 -0
  55. package/dist/json/layerCompatibility.d.ts.map +1 -1
  56. package/dist/json/layerCompatibility.js +5 -1
  57. package/dist/json/layerCompatibility.js.map +1 -1
  58. package/dist/json/layers/DeckColumnLayer.d.ts +12 -0
  59. package/dist/json/layers/DeckColumnLayer.d.ts.map +1 -0
  60. package/dist/json/layers/DeckColumnLayer.js +26 -0
  61. package/dist/json/layers/DeckColumnLayer.js.map +1 -0
  62. package/dist/json/layers/DeckH3HexagonLayer.d.ts +37 -0
  63. package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -0
  64. package/dist/json/layers/DeckH3HexagonLayer.js +96 -0
  65. package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -0
  66. package/dist/json/layers/DeckTripsLayer.d.ts +45 -0
  67. package/dist/json/layers/DeckTripsLayer.d.ts.map +1 -0
  68. package/dist/json/layers/DeckTripsLayer.js +169 -0
  69. package/dist/json/layers/DeckTripsLayer.js.map +1 -0
  70. package/dist/json/layers/index.d.ts +4 -0
  71. package/dist/json/layers/index.d.ts.map +1 -0
  72. package/dist/json/layers/index.js +4 -0
  73. package/dist/json/layers/index.js.map +1 -0
  74. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
  75. package/dist/json/rewriteGeoArrowAccessors.js +5 -0
  76. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
  77. package/dist/mapConfigUtils.d.ts +102 -1
  78. package/dist/mapConfigUtils.d.ts.map +1 -1
  79. package/dist/mapConfigUtils.js +21 -3
  80. package/dist/mapConfigUtils.js.map +1 -1
  81. package/dist/mapLayerConfigUtils.d.ts +15 -0
  82. package/dist/mapLayerConfigUtils.d.ts.map +1 -1
  83. package/dist/mapLayerConfigUtils.js +109 -7
  84. package/dist/mapLayerConfigUtils.js.map +1 -1
  85. package/dist/prepare/detectGeometryColumn.d.ts +10 -1
  86. package/dist/prepare/detectGeometryColumn.d.ts.map +1 -1
  87. package/dist/prepare/detectGeometryColumn.js +48 -6
  88. package/dist/prepare/detectGeometryColumn.js.map +1 -1
  89. package/dist/prepare/wkbDecoder.d.ts.map +1 -1
  90. package/dist/prepare/wkbDecoder.js +88 -1
  91. package/dist/prepare/wkbDecoder.js.map +1 -1
  92. package/dist/prepare/wkbParser.d.ts +5 -0
  93. package/dist/prepare/wkbParser.d.ts.map +1 -1
  94. package/dist/prepare/wkbParser.js +24 -0
  95. package/dist/prepare/wkbParser.js.map +1 -1
  96. package/dist/types.d.ts +14 -4
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/types.js.map +1 -1
  99. package/dist/useDeckMapDatasets.d.ts +17 -0
  100. package/dist/useDeckMapDatasets.d.ts.map +1 -0
  101. package/dist/useDeckMapDatasets.js +69 -0
  102. package/dist/useDeckMapDatasets.js.map +1 -0
  103. package/dist/useDeckMapFitToBounds.d.ts +29 -0
  104. package/dist/useDeckMapFitToBounds.d.ts.map +1 -0
  105. package/dist/useDeckMapFitToBounds.js +333 -0
  106. package/dist/useDeckMapFitToBounds.js.map +1 -0
  107. package/package.json +7 -6
@@ -0,0 +1,169 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import { TripsLayer } from '@deck.gl/geo-layers';
3
+ import * as arrow from 'apache-arrow';
4
+ /**
5
+ * Expand a per-geometry array to per-coordinate by repeating values for each
6
+ * vertex in the geometry (required by deck.gl's binary attribute interface for
7
+ * per-path attributes like getColor on PathLayer/TripsLayer).
8
+ */
9
+ function expandToCoords(input, size, geomOffsets) {
10
+ const numCoords = geomOffsets[geomOffsets.length - 1];
11
+ // @ts-expect-error constructor signature
12
+ const output = new input.constructor(numCoords * size);
13
+ for (let geomIdx = 0; geomIdx < geomOffsets.length - 1; geomIdx++) {
14
+ const start = geomOffsets[geomIdx];
15
+ const end = geomOffsets[geomIdx + 1];
16
+ for (let coordIdx = start; coordIdx < end; coordIdx++) {
17
+ for (let i = 0; i < size; i++) {
18
+ output[coordIdx * size + i] = input[geomIdx * size + i];
19
+ }
20
+ }
21
+ }
22
+ return output;
23
+ }
24
+ /**
25
+ * Custom GeoArrow-compatible TripsLayer wrapper.
26
+ *
27
+ * GeoArrowTripsLayer from @geoarrow/deck.gl-layers@0.3.2 is incompatible with
28
+ * deck.gl 9.3.x: it passes the raw timestamps typed array via binary attributes,
29
+ * but deck.gl 9.3's PathLayer/TripsLayer attribute manager fails to initialize
30
+ * them correctly, producing "Float64Array Error: Float64Array".
31
+ *
32
+ * This wrapper extracts the binary data from Arrow vectors and passes it to the
33
+ * native TripsLayer in a compatible format, properly resolving accessor props
34
+ * (Arrow Vectors → binary attributes, functions → wrapped with batch context).
35
+ */
36
+ export class DeckTripsLayer extends CompositeLayer {
37
+ static layerName = 'GeoArrowTripsLayer';
38
+ static defaultProps = {
39
+ currentTime: { type: 'number', value: 0 },
40
+ trailLength: { type: 'number', value: 120 },
41
+ fadeTrail: true,
42
+ _pathType: 'open',
43
+ };
44
+ renderLayers() {
45
+ const { data: table, getPath, getTimestamps, ...otherProps } = this.props;
46
+ if (!getPath || !getTimestamps)
47
+ return null;
48
+ const layers = [];
49
+ const numChunks = getPath.data.length;
50
+ for (let chunkIdx = 0; chunkIdx < numChunks; chunkIdx++) {
51
+ const lineData = getPath.data[chunkIdx];
52
+ if (!lineData)
53
+ continue;
54
+ const geomOffsets = lineData.valueOffsets;
55
+ const vertexData = lineData.children[0];
56
+ if (!vertexData)
57
+ continue;
58
+ const nDim = vertexData.type.listSize;
59
+ const coordData = vertexData.children[0];
60
+ if (!coordData)
61
+ continue;
62
+ // Arrow chunks may share a single backing buffer with absolute offsets.
63
+ // deck.gl expects relative (zero-based) offsets for startIndices.
64
+ const baseOffset = geomOffsets[0] ?? 0;
65
+ const relativeOffsets = new Int32Array(geomOffsets.length);
66
+ for (let i = 0; i < geomOffsets.length; i++) {
67
+ relativeOffsets[i] = (geomOffsets[i] ?? 0) - baseOffset;
68
+ }
69
+ const numVertices = relativeOffsets[relativeOffsets.length - 1] ?? 0;
70
+ // Slice the coordinate buffer to only this chunk's vertices
71
+ const rawValues = coordData.values;
72
+ const coordStart = baseOffset * nDim;
73
+ const coordEnd = coordStart + numVertices * nDim;
74
+ const flatCoords = coordStart > 0 || coordEnd < rawValues.length
75
+ ? rawValues.slice(coordStart, coordEnd)
76
+ : rawValues;
77
+ const tsData = getTimestamps.data[chunkIdx];
78
+ if (!tsData)
79
+ continue;
80
+ const tsChild = tsData.children[0];
81
+ if (!tsChild)
82
+ continue;
83
+ // Slice timestamps to this chunk's range (same shared-buffer issue)
84
+ const tsBaseOffset = tsData.valueOffsets[0] ?? 0;
85
+ const tsRawValues = tsChild.values;
86
+ const tsStart = tsBaseOffset;
87
+ const tsEnd = tsStart + numVertices;
88
+ // TripsLayer's timestamps attribute does NOT have doublePrecision, so
89
+ // luma.gl's type resolver rejects Float64Array. Timestamps MUST be Float32.
90
+ let tsValues;
91
+ if (tsRawValues instanceof Float32Array) {
92
+ tsValues = tsRawValues.slice(tsStart, tsEnd);
93
+ }
94
+ else {
95
+ tsValues = new Float32Array(numVertices);
96
+ const src = tsRawValues;
97
+ if (src instanceof BigInt64Array || src instanceof BigUint64Array) {
98
+ for (let i = 0; i < numVertices; i++) {
99
+ tsValues[i] = Number(src[tsStart + i]);
100
+ }
101
+ }
102
+ else {
103
+ for (let i = 0; i < numVertices; i++) {
104
+ tsValues[i] = Number(src[tsStart + i]) || 0;
105
+ }
106
+ }
107
+ }
108
+ const { _tripsMaxTimestamp: _unused, ...restProps } = otherProps;
109
+ void _unused;
110
+ const binaryAttributes = {
111
+ getPath: { value: flatCoords, size: nDim },
112
+ getTimestamps: { value: tsValues, size: 1 },
113
+ };
114
+ const layerProps = {};
115
+ const batch = table.batches[chunkIdx];
116
+ for (const [propName, propValue] of Object.entries(restProps)) {
117
+ if (propValue instanceof arrow.Vector) {
118
+ // Arrow Vector accessor → resolve to binary attribute
119
+ const chunkData = propValue.data[chunkIdx];
120
+ if (!chunkData)
121
+ continue;
122
+ if (arrow.DataType.isFixedSizeList(chunkData.type)) {
123
+ const childValues = chunkData.children[0]?.values;
124
+ if (!childValues)
125
+ continue;
126
+ const values = expandToCoords(childValues, chunkData.type.listSize, relativeOffsets);
127
+ binaryAttributes[propName] = {
128
+ value: values,
129
+ size: chunkData.type.listSize,
130
+ normalized: true,
131
+ };
132
+ }
133
+ else if (arrow.DataType.isFloat(chunkData.type)) {
134
+ const values = expandToCoords(chunkData.values, 1, relativeOffsets);
135
+ binaryAttributes[propName] = { value: values, size: 1 };
136
+ }
137
+ }
138
+ else if (typeof propValue === 'function') {
139
+ // Function accessor → wrap to provide batch context
140
+ const fn = propValue;
141
+ layerProps[propName] = (_object, objectInfo) => {
142
+ return fn({
143
+ index: objectInfo.index,
144
+ data: { data: batch },
145
+ target: objectInfo.target,
146
+ });
147
+ };
148
+ }
149
+ else {
150
+ layerProps[propName] = propValue;
151
+ }
152
+ }
153
+ const props = {
154
+ ...layerProps,
155
+ _pathType: 'open',
156
+ id: `${this.props.id}-geoarrow-trip-${chunkIdx}`,
157
+ data: {
158
+ data: batch,
159
+ length: lineData.length,
160
+ startIndices: relativeOffsets,
161
+ attributes: binaryAttributes,
162
+ },
163
+ };
164
+ layers.push(new TripsLayer(props));
165
+ }
166
+ return layers;
167
+ }
168
+ }
169
+ //# sourceMappingURL=DeckTripsLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeckTripsLayer.js","sourceRoot":"","sources":["../../../src/json/layers/DeckTripsLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import {CompositeLayer, type Layer, type LayersList} from '@deck.gl/core';\nimport {TripsLayer} from '@deck.gl/geo-layers';\nimport * as arrow from 'apache-arrow';\n\ntype TypedArray =\n | Uint8Array\n | Uint8ClampedArray\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array\n | Float32Array\n | Float64Array;\n\n/**\n * Expand a per-geometry array to per-coordinate by repeating values for each\n * vertex in the geometry (required by deck.gl's binary attribute interface for\n * per-path attributes like getColor on PathLayer/TripsLayer).\n */\nfunction expandToCoords<T extends TypedArray>(\n input: T,\n size: number,\n geomOffsets: Int32Array,\n): T {\n const numCoords = geomOffsets[geomOffsets.length - 1]!;\n // @ts-expect-error constructor signature\n const output: T = new input.constructor(numCoords * size);\n for (let geomIdx = 0; geomIdx < geomOffsets.length - 1; geomIdx++) {\n const start = geomOffsets[geomIdx]!;\n const end = geomOffsets[geomIdx + 1]!;\n for (let coordIdx = start; coordIdx < end; coordIdx++) {\n for (let i = 0; i < size; i++) {\n output[coordIdx * size + i] = input[geomIdx * size + i]!;\n }\n }\n }\n return output;\n}\n\n/**\n * Custom GeoArrow-compatible TripsLayer wrapper.\n *\n * GeoArrowTripsLayer from @geoarrow/deck.gl-layers@0.3.2 is incompatible with\n * deck.gl 9.3.x: it passes the raw timestamps typed array via binary attributes,\n * but deck.gl 9.3's PathLayer/TripsLayer attribute manager fails to initialize\n * them correctly, producing \"Float64Array Error: Float64Array\".\n *\n * This wrapper extracts the binary data from Arrow vectors and passes it to the\n * native TripsLayer in a compatible format, properly resolving accessor props\n * (Arrow Vectors → binary attributes, functions → wrapped with batch context).\n */\nexport class DeckTripsLayer extends CompositeLayer<{\n data: arrow.Table;\n getPath: arrow.Vector;\n getTimestamps: arrow.Vector;\n getColor?:\n | arrow.Vector\n | [number, number, number, number]\n | ((...args: any[]) => any);\n getWidth?: arrow.Vector | number | ((...args: any[]) => any);\n currentTime?: number;\n trailLength?: number;\n fadeTrail?: boolean;\n widthMinPixels?: number;\n widthMaxPixels?: number;\n opacity?: number;\n _tripsMaxTimestamp?: number;\n [key: string]: unknown;\n}> {\n static layerName = 'GeoArrowTripsLayer';\n static defaultProps = {\n currentTime: {type: 'number', value: 0},\n trailLength: {type: 'number', value: 120},\n fadeTrail: true,\n _pathType: 'open',\n };\n\n renderLayers(): Layer | LayersList | null {\n const {data: table, getPath, getTimestamps, ...otherProps} = this.props;\n\n if (!getPath || !getTimestamps) return null;\n\n const layers: TripsLayer[] = [];\n const numChunks = getPath.data.length;\n\n for (let chunkIdx = 0; chunkIdx < numChunks; chunkIdx++) {\n const lineData = getPath.data[chunkIdx];\n if (!lineData) continue;\n\n const geomOffsets = lineData.valueOffsets;\n const vertexData = lineData.children[0];\n if (!vertexData) continue;\n const nDim = (vertexData.type as arrow.FixedSizeList).listSize;\n const coordData = vertexData.children[0];\n if (!coordData) continue;\n\n // Arrow chunks may share a single backing buffer with absolute offsets.\n // deck.gl expects relative (zero-based) offsets for startIndices.\n const baseOffset = geomOffsets[0] ?? 0;\n const relativeOffsets = new Int32Array(geomOffsets.length);\n for (let i = 0; i < geomOffsets.length; i++) {\n relativeOffsets[i] = (geomOffsets[i] ?? 0) - baseOffset;\n }\n const numVertices = relativeOffsets[relativeOffsets.length - 1] ?? 0;\n\n // Slice the coordinate buffer to only this chunk's vertices\n const rawValues = coordData.values;\n const coordStart = baseOffset * nDim;\n const coordEnd = coordStart + numVertices * nDim;\n const flatCoords =\n coordStart > 0 || coordEnd < rawValues.length\n ? rawValues.slice(coordStart, coordEnd)\n : rawValues;\n\n const tsData = getTimestamps.data[chunkIdx];\n if (!tsData) continue;\n const tsChild = tsData.children[0];\n if (!tsChild) continue;\n\n // Slice timestamps to this chunk's range (same shared-buffer issue)\n const tsBaseOffset = tsData.valueOffsets[0] ?? 0;\n const tsRawValues = tsChild.values;\n const tsStart = tsBaseOffset;\n const tsEnd = tsStart + numVertices;\n\n // TripsLayer's timestamps attribute does NOT have doublePrecision, so\n // luma.gl's type resolver rejects Float64Array. Timestamps MUST be Float32.\n let tsValues: Float32Array;\n if (tsRawValues instanceof Float32Array) {\n tsValues = tsRawValues.slice(tsStart, tsEnd);\n } else {\n tsValues = new Float32Array(numVertices);\n const src = tsRawValues;\n if (src instanceof BigInt64Array || src instanceof BigUint64Array) {\n for (let i = 0; i < numVertices; i++) {\n tsValues[i] = Number(src[tsStart + i]);\n }\n } else {\n for (let i = 0; i < numVertices; i++) {\n tsValues[i] = Number(src[tsStart + i]) || 0;\n }\n }\n }\n\n const {_tripsMaxTimestamp: _unused, ...restProps} = otherProps;\n void _unused;\n\n const binaryAttributes: Record<\n string,\n {value: TypedArray; size: number; normalized?: boolean}\n > = {\n getPath: {value: flatCoords, size: nDim},\n getTimestamps: {value: tsValues, size: 1},\n };\n\n const layerProps: Record<string, unknown> = {};\n const batch = table.batches[chunkIdx];\n\n for (const [propName, propValue] of Object.entries(restProps)) {\n if (propValue instanceof arrow.Vector) {\n // Arrow Vector accessor → resolve to binary attribute\n const chunkData = propValue.data[chunkIdx];\n if (!chunkData) continue;\n\n if (arrow.DataType.isFixedSizeList(chunkData.type)) {\n const childValues = chunkData.children[0]?.values;\n if (!childValues) continue;\n const values = expandToCoords(\n childValues as TypedArray,\n chunkData.type.listSize,\n relativeOffsets,\n );\n binaryAttributes[propName] = {\n value: values,\n size: chunkData.type.listSize,\n normalized: true,\n };\n } else if (arrow.DataType.isFloat(chunkData.type)) {\n const values = expandToCoords(\n chunkData.values as TypedArray,\n 1,\n relativeOffsets,\n );\n binaryAttributes[propName] = {value: values, size: 1};\n }\n } else if (typeof propValue === 'function') {\n // Function accessor → wrap to provide batch context\n const fn = propValue;\n layerProps[propName] = (\n _object: unknown,\n objectInfo: {index: number; target?: number[]},\n ) => {\n return fn({\n index: objectInfo.index,\n data: {data: batch},\n target: objectInfo.target,\n });\n };\n } else {\n layerProps[propName] = propValue;\n }\n }\n\n const props = {\n ...layerProps,\n _pathType: 'open' as const,\n id: `${this.props.id}-geoarrow-trip-${chunkIdx}`,\n data: {\n data: batch,\n length: lineData.length,\n startIndices: relativeOffsets,\n attributes: binaryAttributes,\n },\n };\n\n layers.push(new TripsLayer(props as any));\n }\n\n return layers;\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { DeckColumnLayer } from './DeckColumnLayer';
2
+ export { DeckH3HexagonLayer } from './DeckH3HexagonLayer';
3
+ export { DeckTripsLayer } from './DeckTripsLayer';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/json/layers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { DeckColumnLayer } from './DeckColumnLayer';
2
+ export { DeckH3HexagonLayer } from './DeckH3HexagonLayer';
3
+ export { DeckTripsLayer } from './DeckTripsLayer';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/json/layers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC","sourcesContent":["export {DeckColumnLayer} from './DeckColumnLayer';\nexport {DeckH3HexagonLayer} from './DeckH3HexagonLayer';\nexport {DeckTripsLayer} from './DeckTripsLayer';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rewriteGeoArrowAccessors.d.ts","sourceRoot":"","sources":["../../src/json/rewriteGeoArrowAccessors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AA2BtC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,2BAsCA"}
1
+ {"version":3,"file":"rewriteGeoArrowAccessors.d.ts","sourceRoot":"","sources":["../../src/json/rewriteGeoArrowAccessors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AA2BtC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,2BA6CA"}
@@ -41,6 +41,11 @@ export function rewriteGeoArrowAccessors(options) {
41
41
  nextProps[propName] = vector;
42
42
  continue;
43
43
  }
44
+ if (!vector) {
45
+ console.warn(`Column "${expression.trim()}" not found in dataset for accessor "${propName}". Skipping accessor.`);
46
+ delete nextProps[propName];
47
+ continue;
48
+ }
44
49
  }
45
50
  // TODO(geoarrow-upgrade): This fallback exists because 0.3.x GeoArrow layers do
46
51
  // not share `@deck.gl/json`'s normal row accessor contract. If the next version
@@ -1 +1 @@
1
- {"version":3,"file":"rewriteGeoArrowAccessors.js","sourceRoot":"","sources":["../../src/json/rewriteGeoArrowAccessors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAC,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAE3D,SAAS,uBAAuB,CAAC,UAAkB;IACjD,OAAO,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAgB,EAAE,MAAoB;IACxE,kFAAkF;IAClF,8EAA8E;IAC9E,kFAAkF;IAClF,+EAA+E;IAC/E,8EAA8E;IAC9E,YAAY;IACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAIxC;IACC,MAAM,EAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAC,GAAG,OAAO,CAAC;IAC1C,MAAM,aAAa,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,EAAC,GAAG,KAAK,EAAC,CAAC;IAE7B,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,IACE,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;YAC5B,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAC3B,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,IACE,aAAa,CAAC,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpD,uBAAuB,CAAC,UAAU,CAAC,EACnC,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,IAAI,MAAM,IAAI,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC3D,SAAS,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;gBAC7B,SAAS;YACX,CAAC;QACH,CAAC;QAED,gFAAgF;QAChF,gFAAgF;QAChF,+EAA+E;QAC/E,wCAAwC;QACxC,SAAS,CAAC,QAAQ,CAAC,GAAG,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import * as arrow from 'apache-arrow';\nimport {compileGeoArrowAccessor} from './compileGeoArrowAccessor';\nimport {getLayerCompatibility} from './layerCompatibility';\n\nfunction isSimpleColumnReference(expression: string) {\n return /^[A-Za-z_$][\\w$]*$/.test(expression.trim());\n}\n\nfunction canUseDirectVectorAccessor(propName: string, vector: arrow.Vector) {\n // TODO(geoarrow-upgrade): This is intentionally conservative for published 0.3.x.\n // Direct numeric vectors (for example `getRadius`) currently end up in deck's\n // binary attribute path and trigger `Float64Array` initialization failures in the\n // GeoArrow scatterplot wrapper. Re-test which direct vector accessors are safe\n // after the next GeoArrow release and widen this gate if the runtime contract\n // improves.\n if (!propName.endsWith('Color')) {\n return false;\n }\n\n const firstChunk = vector.data[0];\n if (!firstChunk || !arrow.DataType.isFixedSizeList(firstChunk.type)) {\n return false;\n }\n\n return true;\n}\n\nexport function rewriteGeoArrowAccessors(options: {\n props: Record<string, unknown>;\n table: arrow.Table;\n layerName: string;\n}) {\n const {props, table, layerName} = options;\n const compatibility = getLayerCompatibility(layerName);\n if (!compatibility || compatibility.representation !== 'geoarrow') {\n return props;\n }\n\n const nextProps = {...props};\n\n for (const [propName, propValue] of Object.entries(nextProps)) {\n if (\n typeof propValue !== 'string' ||\n !propValue.startsWith('@@=') ||\n !propName.startsWith('get')\n ) {\n continue;\n }\n\n const expression = propValue.slice(3);\n if (\n compatibility.vectorAccessorProps.includes(propName) &&\n isSimpleColumnReference(expression)\n ) {\n const vector = table.getChild(expression.trim());\n if (vector && canUseDirectVectorAccessor(propName, vector)) {\n nextProps[propName] = vector;\n continue;\n }\n }\n\n // TODO(geoarrow-upgrade): This fallback exists because 0.3.x GeoArrow layers do\n // not share `@deck.gl/json`'s normal row accessor contract. If the next version\n // supports standard deck/json accessors, or offers native expression handling,\n // prefer that over our custom compiler.\n nextProps[propName] = compileGeoArrowAccessor(expression, table);\n }\n\n return nextProps;\n}\n"]}
1
+ {"version":3,"file":"rewriteGeoArrowAccessors.js","sourceRoot":"","sources":["../../src/json/rewriteGeoArrowAccessors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAC,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAE3D,SAAS,uBAAuB,CAAC,UAAkB;IACjD,OAAO,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAgB,EAAE,MAAoB;IACxE,kFAAkF;IAClF,8EAA8E;IAC9E,kFAAkF;IAClF,+EAA+E;IAC/E,8EAA8E;IAC9E,YAAY;IACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAIxC;IACC,MAAM,EAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAC,GAAG,OAAO,CAAC;IAC1C,MAAM,aAAa,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,EAAC,GAAG,KAAK,EAAC,CAAC;IAE7B,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,IACE,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;YAC5B,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAC3B,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,IACE,aAAa,CAAC,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpD,uBAAuB,CAAC,UAAU,CAAC,EACnC,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,IAAI,MAAM,IAAI,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC3D,SAAS,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CACV,WAAW,UAAU,CAAC,IAAI,EAAE,wCAAwC,QAAQ,uBAAuB,CACpG,CAAC;gBACF,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;QACH,CAAC;QAED,gFAAgF;QAChF,gFAAgF;QAChF,+EAA+E;QAC/E,wCAAwC;QACxC,SAAS,CAAC,QAAQ,CAAC,GAAG,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import * as arrow from 'apache-arrow';\nimport {compileGeoArrowAccessor} from './compileGeoArrowAccessor';\nimport {getLayerCompatibility} from './layerCompatibility';\n\nfunction isSimpleColumnReference(expression: string) {\n return /^[A-Za-z_$][\\w$]*$/.test(expression.trim());\n}\n\nfunction canUseDirectVectorAccessor(propName: string, vector: arrow.Vector) {\n // TODO(geoarrow-upgrade): This is intentionally conservative for published 0.3.x.\n // Direct numeric vectors (for example `getRadius`) currently end up in deck's\n // binary attribute path and trigger `Float64Array` initialization failures in the\n // GeoArrow scatterplot wrapper. Re-test which direct vector accessors are safe\n // after the next GeoArrow release and widen this gate if the runtime contract\n // improves.\n if (!propName.endsWith('Color')) {\n return false;\n }\n\n const firstChunk = vector.data[0];\n if (!firstChunk || !arrow.DataType.isFixedSizeList(firstChunk.type)) {\n return false;\n }\n\n return true;\n}\n\nexport function rewriteGeoArrowAccessors(options: {\n props: Record<string, unknown>;\n table: arrow.Table;\n layerName: string;\n}) {\n const {props, table, layerName} = options;\n const compatibility = getLayerCompatibility(layerName);\n if (!compatibility || compatibility.representation !== 'geoarrow') {\n return props;\n }\n\n const nextProps = {...props};\n\n for (const [propName, propValue] of Object.entries(nextProps)) {\n if (\n typeof propValue !== 'string' ||\n !propValue.startsWith('@@=') ||\n !propName.startsWith('get')\n ) {\n continue;\n }\n\n const expression = propValue.slice(3);\n if (\n compatibility.vectorAccessorProps.includes(propName) &&\n isSimpleColumnReference(expression)\n ) {\n const vector = table.getChild(expression.trim());\n if (vector && canUseDirectVectorAccessor(propName, vector)) {\n nextProps[propName] = vector;\n continue;\n }\n if (!vector) {\n console.warn(\n `Column \"${expression.trim()}\" not found in dataset for accessor \"${propName}\". Skipping accessor.`,\n );\n delete nextProps[propName];\n continue;\n }\n }\n\n // TODO(geoarrow-upgrade): This fallback exists because 0.3.x GeoArrow layers do\n // not share `@deck.gl/json`'s normal row accessor contract. If the next version\n // supports standard deck/json accessors, or offers native expression handling,\n // prefer that over our custom compiler.\n nextProps[propName] = compileGeoArrowAccessor(expression, table);\n }\n\n return nextProps;\n}\n"]}
@@ -58,5 +58,106 @@ export declare function createDeckMapDashboardPanelConfigForTable(options: {
58
58
  fillColor?: DeckMapFillColor;
59
59
  mapStyle?: string;
60
60
  }): any;
61
- export declare function regenerateMapConfigForTable(panel: MosaicDashboardPanelConfigType, table: DataTable, longitudeColumn?: string, latitudeColumn?: string): any;
61
+ export declare function regenerateMapConfigForTable(panel: MosaicDashboardPanelConfigType, table: DataTable, longitudeColumn?: string, latitudeColumn?: string): Record<string, unknown> | {
62
+ chartType: "histogram";
63
+ settings: {
64
+ field?: string | undefined;
65
+ maxBins?: number | undefined;
66
+ color?: string | undefined;
67
+ };
68
+ settingsOpen?: boolean | undefined;
69
+ dataPolicy?: {
70
+ disabled?: boolean | undefined;
71
+ maxRows?: number | undefined;
72
+ reason?: string | undefined;
73
+ } | undefined;
74
+ } | {
75
+ chartType: "count-plot";
76
+ settings: {
77
+ field?: string | undefined;
78
+ };
79
+ settingsOpen?: boolean | undefined;
80
+ dataPolicy?: {
81
+ disabled?: boolean | undefined;
82
+ maxRows?: number | undefined;
83
+ reason?: string | undefined;
84
+ } | undefined;
85
+ } | {
86
+ chartType: "line-chart";
87
+ settings: {
88
+ showLegend: boolean;
89
+ x?: string | undefined;
90
+ xInterval?: "month" | "week" | "second" | "minute" | "hour" | "day" | "quarter" | "year" | undefined;
91
+ yFields?: {
92
+ field: string;
93
+ aggregate: "min" | "max" | "sum" | "avg";
94
+ color?: string | undefined;
95
+ }[] | undefined;
96
+ };
97
+ settingsOpen?: boolean | undefined;
98
+ dataPolicy?: {
99
+ disabled?: boolean | undefined;
100
+ maxRows?: number | undefined;
101
+ reason?: string | undefined;
102
+ } | undefined;
103
+ } | {
104
+ chartType: "scatter-plot";
105
+ settings: {
106
+ x?: string | undefined;
107
+ y?: string | undefined;
108
+ size?: string | undefined;
109
+ };
110
+ settingsOpen?: boolean | undefined;
111
+ dataPolicy?: {
112
+ disabled?: boolean | undefined;
113
+ maxRows?: number | undefined;
114
+ reason?: string | undefined;
115
+ } | undefined;
116
+ } | {
117
+ chartType: "heatmap";
118
+ settings: {
119
+ x?: string | undefined;
120
+ y?: string | undefined;
121
+ };
122
+ settingsOpen?: boolean | undefined;
123
+ dataPolicy?: {
124
+ disabled?: boolean | undefined;
125
+ maxRows?: number | undefined;
126
+ reason?: string | undefined;
127
+ } | undefined;
128
+ } | {
129
+ chartType: "box-plot";
130
+ settings: {
131
+ x?: string | undefined;
132
+ y?: string | undefined;
133
+ };
134
+ settingsOpen?: boolean | undefined;
135
+ dataPolicy?: {
136
+ disabled?: boolean | undefined;
137
+ maxRows?: number | undefined;
138
+ reason?: string | undefined;
139
+ } | undefined;
140
+ } | {
141
+ chartType: "custom-spec";
142
+ settings: {
143
+ vgPlotSpec?: unknown;
144
+ };
145
+ settingsOpen?: boolean | undefined;
146
+ dataPolicy?: {
147
+ disabled?: boolean | undefined;
148
+ maxRows?: number | undefined;
149
+ reason?: string | undefined;
150
+ } | undefined;
151
+ } | {
152
+ chartType: string;
153
+ settings: Record<string, unknown>;
154
+ settingsOpen?: boolean | undefined;
155
+ dataPolicy?: {
156
+ disabled?: boolean | undefined;
157
+ maxRows?: number | undefined;
158
+ reason?: string | undefined;
159
+ } | undefined;
160
+ } | {
161
+ pageSize?: number | undefined;
162
+ };
62
163
  //# sourceMappingURL=mapConfigUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,8BAA8B,EAAC,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AAQ1D,MAAM,MAAM,mBAAmB,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAChE,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN;IACE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACN,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAWrC,wBAAgB,mCAAmC,CACjD,OAAO,CAAC,EAAE,mBAAmB,EAAE;;;SAQhC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,SAAS;;;SAG7D;AAwBD,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE;;;SAkBxE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,SAAS;;;SAGnD;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,UAE3D;AAED,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,qBAAqB,UAYtC;AAuED,wBAAgB,yBAAyB,CACvC,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,gBAAgB,CAQlB;AAED,wBAAgB,oCAAoC,CAAC,OAAO,EAAE;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,2BAA2B,CA2F9B;AAED,wBAAgB,yCAAyC,CAAC,OAAO,EAAE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,OAKA;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,8BAA8B,EACrC,KAAK,EAAE,SAAS,EAChB,eAAe,CAAC,EAAE,MAAM,EACxB,cAAc,CAAC,EAAE,MAAM,OAuBxB"}
1
+ {"version":3,"file":"mapConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,8BAA8B,EAAC,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AAQ1D,MAAM,MAAM,mBAAmB,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAChE,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN;IACE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACN,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAWrC,wBAAgB,mCAAmC,CACjD,OAAO,CAAC,EAAE,mBAAmB,EAAE;;;SAQhC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,SAAS;;;SAG7D;AAwBD,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE;;;SAkBxE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,SAAS;;;SAGnD;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,UAE3D;AAED,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,qBAAqB,UAYtC;AAuED,wBAAgB,yBAAyB,CACvC,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,gBAAgB,CAQlB;AAED,wBAAgB,oCAAoC,CAAC,OAAO,EAAE;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,2BAA2B,CAyG9B;AAED,wBAAgB,yCAAyC,CAAC,OAAO,EAAE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,OAKA;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,8BAA8B,EACrC,KAAK,EAAE,SAAS,EAChB,eAAe,CAAC,EAAE,MAAM,EACxB,cAAc,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BxB"}
@@ -174,7 +174,12 @@ export function createDeckMapDashboardConfigForTable(options) {
174
174
  ? 'GeoArrowScatterplotLayer'
175
175
  : 'GeoArrowPolygonLayer',
176
176
  id: datasetId,
177
- _sqlroomsBinding: { dataset: datasetId },
177
+ _sqlroomsBinding: {
178
+ dataset: datasetId,
179
+ ...(detectedGeometryColumn
180
+ ? { geometryColumn: detectedGeometryColumn.geometryColumn }
181
+ : {}),
182
+ },
178
183
  filled: true,
179
184
  stroked: false,
180
185
  pickable: true,
@@ -201,7 +206,16 @@ export function createDeckMapDashboardConfigForTable(options) {
201
206
  maxZoom: 12,
202
207
  },
203
208
  }
204
- : {}),
209
+ : detectedGeometryColumn
210
+ ? {
211
+ fitToData: {
212
+ dataset: datasetId,
213
+ geometryColumn: detectedGeometryColumn.geometryColumn,
214
+ padding: 40,
215
+ maxZoom: 12,
216
+ },
217
+ }
218
+ : {}),
205
219
  ...(options.mapStyle ? { mapStyle: options.mapStyle } : {}),
206
220
  };
207
221
  }
@@ -225,9 +239,13 @@ export function regenerateMapConfigForTable(panel, table, longitudeColumn, latit
225
239
  longitudeColumn,
226
240
  latitudeColumn,
227
241
  });
242
+ // Preserve existing layer spec (layer types, styling, bindings) — only
243
+ // update the dataset source and fitToData so the data re-fetches with the
244
+ // new coordinate columns.
228
245
  return {
229
246
  ...existingConfig,
230
- ...nextConfig,
247
+ datasets: nextConfig.datasets,
248
+ fitToData: nextConfig.fitToData ?? existingConfig.fitToData,
231
249
  };
232
250
  }
233
251
  //# sourceMappingURL=mapConfigUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapConfigUtils.js","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iCAAiC,GAElC,MAAM,mBAAmB,CAAC;AAG3B,MAAM,sBAAsB,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AACxE,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AACvD,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACnD,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAClD,MAAM,kBAAkB,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAcxD,SAAS,gBAAgB,CACvB,OAA8B,EAC9B,UAAoB;IAEpB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1E,EAAE,IAAI,CAAC;AACX,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,OAA+B;IAE/B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACxE,OAAO,eAAe,IAAI,cAAc;QACtC,CAAC,CAAC,EAAC,eAAe,EAAE,cAAc,EAAC;QACnC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAiB;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,mCAAmC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,yBAAyB,CAChC,MAA2B;IAE3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IACE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACvB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IACE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EACrB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAA+B;IACvE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IAC7E,MAAM,cAAc,GAClB,CAAC,mBAAmB;QAClB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,mBAAmB,CAAC;QAC/D,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACtB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IAEL,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO;QACL,cAAc,EAAE,cAAc,CAAC,IAAI;QACnC,oBAAoB,EAAE,yBAAyB,CAAC,cAAc,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,cAAqC;IAErC,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,cAAc;aAClB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;aAC9C,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC;SAC1E,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC/C,GAAG,CAAC,yBAAyB,CAAC;SAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,yBAAyB,CAChC,OAA8B,EAC9B,UAAkB,EAClB,IAAY;IAEZ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,YAAY,UAAU,yBAAyB,OAAO;aAClE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;aAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,+BAA+B,CAAC,OAIxC;IACC,MAAM,WAAW,GACf,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,cAAc;QAC/C,CAAC,CAAC;YACE,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC;QACH,CAAC,CAAC,mCAAmC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,2HAA2H,CAC5H,CAAC;IACJ,CAAC;IAED,yBAAyB,CACvB,OAAO,CAAC,OAAO,EACf,WAAW,CAAC,eAAe,EAC3B,WAAW,CACZ,CAAC;IACF,yBAAyB,CACvB,OAAO,CAAC,OAAO,EACf,WAAW,CAAC,cAAc,EAC1B,UAAU,CACX,CAAC;IACF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,2BAA2B,CAAC,OAMpC;IACC,MAAM,eAAe,GAAG,yBAAyB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3E,MAAM,cAAc,GAAG,yBAAyB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzE,MAAM,qBAAqB,GAAG,OAAO,CAAC,cAAc;QAClD,EAAE,IAAI,EAAE;SACP,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,qBAAqB;QACtC,CAAC,CAAC,IAAI,qBAAqB,wCAAwC;QACnE,CAAC,CAAC,6BAA6B,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE1D,OAAO;QACL,+BAA+B,eAAe,KAAK,cAAc,SAAS,yBAAyB,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;QAC7H,QAAQ,UAAU,EAAE;QACpB,SAAS,eAAe,oBAAoB,cAAc,cAAc;KACzE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,SAAoB;IAEpB,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,CAAC,GAAG,kBAAkB,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,OAYpD;IACC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,MAAM,sBAAsB,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAC3E,MAAM,mBAAmB,GACvB,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,cAAc;QAC/C,CAAC,CAAC;YACE,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC;QACH,CAAC,CAAC,mCAAmC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,sBAAsB,GAAG,sBAAsB;QACnD,CAAC,CAAC;YACE,cAAc,EAAE,sBAAsB;YACtC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;SACnD;QACH,CAAC,CAAC,mBAAmB;YACnB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,sBAAsB;QACxC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,+BAA+B,CAAC;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;IACP,MAAM,cAAc,GAClB,sBAAsB,EAAE,cAAc,IAAI,uBAAuB,CAAC;IACpE,MAAM,oBAAoB,GACxB,OAAO,CAAC,oBAAoB;QAC5B,sBAAsB,EAAE,oBAAoB,CAAC;IAC/C,MAAM,MAAM,GAAG,WAAW;QACxB,CAAC,CAAC;YACE,QAAQ,EAAE,2BAA2B,CAAC;gBACpC,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,SAAS;gBAC3D,eAAe,EAAE,WAAW,CAAC,eAAe;gBAC5C,cAAc,EAAE,WAAW,CAAC,cAAc;gBAC1C,cAAc;aACf,CAAC;SACH;QACH,CAAC,CAAC,OAAO,CAAC,cAAc;YACtB,CAAC,CAAC,EAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAC;YACpC,CAAC,CAAC,EAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAC,CAAC;IAErC,IAAI,sBAAsB,EAAE,CAAC;QAC3B,yBAAyB,CACvB,OAAO,CAAC,OAAO,EACf,sBAAsB,CAAC,cAAc,EACrC,UAAU,CACX,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,gBAAgB,EAAE,EAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAC;YACzD,MAAM,EAAE;gBACN;oBACE,QAAQ,EAAE,WAAW;wBACnB,CAAC,CAAC,0BAA0B;wBAC5B,CAAC,CAAC,sBAAsB;oBAC1B,EAAE,EAAE,SAAS;oBACb,gBAAgB,EAAE,EAAC,OAAO,EAAE,SAAS,EAAC;oBACtC,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,IAAI;oBACd,WAAW,EAAE,QAAQ;oBACrB,SAAS,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC;oBACnC,YAAY,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,GAAG,kBAAkB,CAAC;iBAC3D;aACF;SACF;QACD,QAAQ,EAAE;YACR,CAAC,SAAS,CAAC,EAAE;gBACX,MAAM;gBACN,cAAc;gBACd,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB;aACjE;SACF;QACD,GAAG,CAAC,WAAW;YACb,CAAC,CAAC;gBACE,SAAS,EAAE;oBACT,OAAO,EAAE,SAAS;oBAClB,eAAe,EAAE,WAAW,CAAC,eAAe;oBAC5C,cAAc,EAAE,WAAW,CAAC,cAAc;oBAC1C,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,EAAE;iBACZ;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yCAAyC,CAAC,OAazD;IACC,OAAO,iCAAiC,CAAC;QACvC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,oCAAoC,CAAC,OAAO,CAAC;KACjD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAqC,EACrC,KAAgB,EAChB,eAAwB,EACxB,cAAuB;IAEvB,IACE,CAAC,CAAC,eAAe,IAAI,cAAc,CAAC;QACpC,CAAC,4BAA4B,CAAC,KAAK,CAAC;QACpC,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAC1B,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,MAAa,CAAC;IAC3C,MAAM,UAAU,GAAG,oCAAoC,CAAC;QACtD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,cAAc,EAAE,KAAK,CAAC,KAAK;QAC3B,eAAe;QACf,cAAc;KACf,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,cAAc;QACjB,GAAG,UAAU;KACd,CAAC;AACJ,CAAC","sourcesContent":["import type {MosaicDashboardPanelConfigType} from '@sqlrooms/mosaic';\nimport type {DataTable} from '@sqlrooms/duckdb';\nimport {\n createDeckMapDashboardPanelConfig,\n type DeckMapDashboardPanelConfig,\n} from './dashboardConfig';\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\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\nexport function findDeckMapLongitudeLatitudeColumns(\n columns?: DeckMapConfigColumn[],\n) {\n if (!columns) return null;\n const longitudeColumn = findColumnByName(columns, LONGITUDE_COLUMN_NAMES);\n const latitudeColumn = findColumnByName(columns, LATITUDE_COLUMN_NAMES);\n return longitudeColumn && latitudeColumn\n ? {longitudeColumn, latitudeColumn}\n : null;\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) {\n if (typeof tableReference === 'string') {\n return tableReference\n .split('.')\n .map((part) => quoteDeckMapSqlIdentifier(part))\n .join('.');\n }\n return [tableReference.database, tableReference.schema, tableReference.table]\n .filter((part): part is string => Boolean(part))\n .map(quoteDeckMapSqlIdentifier)\n .join('.');\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\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 createDeckMapDashboardConfigForTable(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}): DeckMapDashboardPanelConfig {\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 ? {\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 : 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: {dataset: datasetId},\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 : {}),\n ...(options.mapStyle ? {mapStyle: options.mapStyle} : {}),\n };\n}\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 ...createDeckMapDashboardConfigForTable(options),\n });\n}\n\nexport function regenerateMapConfigForTable(\n panel: MosaicDashboardPanelConfigType,\n table: DataTable,\n longitudeColumn?: string,\n latitudeColumn?: string,\n) {\n if (\n !(longitudeColumn && latitudeColumn) &&\n !findLongitudeLatitudeColumns(table) &&\n !findGeometryColumn(table)\n ) {\n return panel.config;\n }\n\n const existingConfig = panel.config as any;\n const nextConfig = createDeckMapDashboardConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n longitudeColumn,\n latitudeColumn,\n });\n\n return {\n ...existingConfig,\n ...nextConfig,\n };\n}\n"]}
1
+ {"version":3,"file":"mapConfigUtils.js","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {MosaicDashboardPanelConfigType} from '@sqlrooms/mosaic';\nimport type {DataTable} from '@sqlrooms/duckdb';\nimport {\n createDeckMapDashboardPanelConfig,\n type DeckMapDashboardPanelConfig,\n} from './dashboardConfig';\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\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\nexport function findDeckMapLongitudeLatitudeColumns(\n columns?: DeckMapConfigColumn[],\n) {\n if (!columns) return null;\n const longitudeColumn = findColumnByName(columns, LONGITUDE_COLUMN_NAMES);\n const latitudeColumn = findColumnByName(columns, LATITUDE_COLUMN_NAMES);\n return longitudeColumn && latitudeColumn\n ? {longitudeColumn, latitudeColumn}\n : null;\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) {\n if (typeof tableReference === 'string') {\n return tableReference\n .split('.')\n .map((part) => quoteDeckMapSqlIdentifier(part))\n .join('.');\n }\n return [tableReference.database, tableReference.schema, tableReference.table]\n .filter((part): part is string => Boolean(part))\n .map(quoteDeckMapSqlIdentifier)\n .join('.');\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\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 createDeckMapDashboardConfigForTable(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}): DeckMapDashboardPanelConfig {\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 ? {\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 : 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 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 ...createDeckMapDashboardConfigForTable(options),\n });\n}\n\nexport function regenerateMapConfigForTable(\n panel: MosaicDashboardPanelConfigType,\n table: DataTable,\n longitudeColumn?: string,\n latitudeColumn?: string,\n) {\n if (\n !(longitudeColumn && latitudeColumn) &&\n !findLongitudeLatitudeColumns(table) &&\n !findGeometryColumn(table)\n ) {\n return panel.config;\n }\n\n const existingConfig = panel.config as DeckMapDashboardPanelConfig;\n const nextConfig = createDeckMapDashboardConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n longitudeColumn,\n latitudeColumn,\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"]}
@@ -22,10 +22,25 @@ export declare const DECK_MAP_COLOR_SCALE_TYPE_OPTIONS: ReadonlyArray<{
22
22
  export declare function getDeckMapLayerRecords(config: DeckMapDashboardPanelConfig): DeckMapLayerRecord[];
23
23
  export declare function getDeckMapLayerDatasetId(layer: DeckMapLayerRecord | undefined): string | undefined;
24
24
  export declare function usesGeometryColumnSetting(layerType: unknown): boolean;
25
+ export declare function usesH3ColumnSetting(layerType: unknown): boolean;
26
+ export declare function usesArcColumnSetting(layerType: unknown): boolean;
27
+ export declare function usesRadiusSetting(layerType: unknown): boolean;
28
+ export declare function usesColumnRadiusSetting(layerType: unknown): boolean;
29
+ export declare function usesTripsSettings(layerType: unknown): boolean;
30
+ export declare function usesExtrusionSettings(layerType: unknown): boolean;
25
31
  export declare function getDeckMapColorAccessorOptions(layerType: unknown): typeof DECK_MAP_COLOR_ACCESSOR_OPTIONS;
26
32
  export declare function updateDeckMapLayer(config: DeckMapDashboardPanelConfig, layerIndex: number, updater: (layer: DeckMapLayerRecord) => DeckMapLayerRecord): DeckMapDashboardPanelConfig;
27
33
  export declare function setDeckMapLayerType(config: DeckMapDashboardPanelConfig, layerIndex: number, layerType: string): DeckMapDashboardPanelConfig;
28
34
  export declare function setDeckMapLayerGeometryColumn(config: DeckMapDashboardPanelConfig, layerIndex: number, geometryColumn: string): DeckMapDashboardPanelConfig;
35
+ export declare function setDeckMapLayerHexagonColumn(config: DeckMapDashboardPanelConfig, layerIndex: number, hexagonColumn: string): DeckMapDashboardPanelConfig;
36
+ export declare function setDeckMapLayerArcColumns(config: DeckMapDashboardPanelConfig, layerIndex: number, columns: {
37
+ sourceGeometryColumn?: string;
38
+ targetGeometryColumn?: string;
39
+ sourceLatitudeColumn?: string;
40
+ sourceLongitudeColumn?: string;
41
+ targetLatitudeColumn?: string;
42
+ targetLongitudeColumn?: string;
43
+ }): DeckMapDashboardPanelConfig;
29
44
  export declare function getDeckMapLayerColorScale(layer: DeckMapLayerRecord | undefined, accessor: DeckMapLayerColorAccessor): DeckMapLayerColorScaleFunction | undefined;
30
45
  export declare function setDeckMapLayerColorScale(config: DeckMapDashboardPanelConfig, layerIndex: number, accessor: DeckMapLayerColorAccessor, colorScale: DeckMapLayerColorScaleFunction): DeckMapDashboardPanelConfig;
31
46
  export declare function clearDeckMapLayerColorScale(config: DeckMapDashboardPanelConfig, layerIndex: number, accessor: DeckMapLayerColorAccessor): DeckMapDashboardPanelConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"mapLayerConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAG/C,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzD,MAAM,MAAM,8BAA8B,GAAG,gBAAgB,GAAG;IAC9D,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,cAAc,GACd,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,eAAO,MAAM,2BAA2B,EAAE,aAAa,CAAC;IACtD,KAAK,EAAE,iBAAiB,GAAG,2BAA2B,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;CACf,CAWA,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,aAAa,CAAC;IAC1D,KAAK,EAAE,yBAAyB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf,CAMA,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,aAAa,CAAC;IAC5D,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,gBAAgB,CAAC;CACjC,CAMA,CAAC;AAuBF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,2BAA2B,GAClC,kBAAkB,EAAE,CAGtB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,OAAO,WAK3D;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,OAAO,GACjB,OAAO,+BAA+B,CAsBxC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,kBAAkB,GACzD,2BAA2B,CAoB7B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,2BAA2B,CAK7B;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,2BAA2B,CAiB7B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,QAAQ,EAAE,yBAAyB,GAClC,8BAA8B,GAAG,SAAS,CAK5C;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,yBAAyB,EACnC,UAAU,EAAE,8BAA8B,GACzC,2BAA2B,CAK7B;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,yBAAyB,GAClC,2BAA2B,CAM7B;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,8BAA8B,CAuEjC"}
1
+ {"version":3,"file":"mapLayerConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAG/C,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzD,MAAM,MAAM,8BAA8B,GAAG,gBAAgB,GAAG;IAC9D,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,cAAc,GACd,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,eAAO,MAAM,2BAA2B,EAAE,aAAa,CAAC;IACtD,KAAK,EAAE,iBAAiB,GAAG,2BAA2B,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;CACf,CAWA,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,aAAa,CAAC;IAC1D,KAAK,EAAE,yBAAyB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf,CAMA,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,aAAa,CAAC;IAC5D,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,gBAAgB,CAAC;CACjC,CAMA,CAAC;AAwDF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,2BAA2B,GAClC,kBAAkB,EAAE,CAGtB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,OAAO,WAK3D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,WAIrD;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,WAKtD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,WAKnD;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,WAKzD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,WAKnD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,WAKvD;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,OAAO,GACjB,OAAO,+BAA+B,CAsBxC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,kBAAkB,GACzD,2BAA2B,CAoB7B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,2BAA2B,CAiB7B;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,2BAA2B,CAkC7B;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,2BAA2B,CAS7B;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,GACA,2BAA2B,CAQ7B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,QAAQ,EAAE,yBAAyB,GAClC,8BAA8B,GAAG,SAAS,CAK5C;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,yBAAyB,EACnC,UAAU,EAAE,8BAA8B,GACzC,2BAA2B,CAK7B;AAMD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,yBAAyB,GAClC,2BAA2B,CAU7B;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,8BAA8B,CAuEjC"}