@sqlrooms/deck 0.29.0-rc.2 → 0.29.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +9 -0
- package/README.md +69 -0
- package/dist/DeckJsonMap.d.ts +4 -0
- package/dist/DeckJsonMap.d.ts.map +1 -0
- package/dist/{DeckMap.js → DeckJsonMap.js} +57 -44
- package/dist/DeckJsonMap.js.map +1 -0
- package/dist/DeckJsonMapSpec.d.ts +7617 -0
- package/dist/DeckJsonMapSpec.d.ts.map +1 -0
- package/dist/DeckJsonMapSpec.js +81 -0
- package/dist/DeckJsonMapSpec.js.map +1 -0
- package/dist/DeckMapConfigPopoverEditor.d.ts +8 -0
- package/dist/DeckMapConfigPopoverEditor.d.ts.map +1 -0
- package/dist/DeckMapConfigPopoverEditor.js +43 -0
- package/dist/DeckMapConfigPopoverEditor.js.map +1 -0
- package/dist/createDeckJsonSpecFromDatasets.d.ts +11 -0
- package/dist/createDeckJsonSpecFromDatasets.d.ts.map +1 -0
- package/dist/createDeckJsonSpecFromDatasets.js +85 -0
- package/dist/createDeckJsonSpecFromDatasets.js.map +1 -0
- package/dist/dashboard.d.ts +4 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +465 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/dashboardConfig.d.ts +51 -0
- package/dist/dashboardConfig.d.ts.map +1 -0
- package/dist/dashboardConfig.js +54 -0
- package/dist/dashboardConfig.js.map +1 -0
- package/dist/datasets/PreparedDatasetStore.d.ts +120 -0
- package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -0
- package/dist/datasets/PreparedDatasetStore.js +262 -0
- package/dist/datasets/PreparedDatasetStore.js.map +1 -0
- package/dist/datasets/helpers.d.ts +57 -0
- package/dist/datasets/helpers.d.ts.map +1 -0
- package/dist/datasets/helpers.js +146 -0
- package/dist/datasets/helpers.js.map +1 -0
- package/dist/datasets/normalizeDatasets.d.ts +8 -2
- package/dist/datasets/normalizeDatasets.d.ts.map +1 -1
- package/dist/datasets/normalizeDatasets.js +33 -48
- package/dist/datasets/normalizeDatasets.js.map +1 -1
- package/dist/datasets/tableAdapter.d.ts +11 -0
- package/dist/datasets/tableAdapter.d.ts.map +1 -0
- package/dist/datasets/tableAdapter.js +11 -0
- package/dist/datasets/tableAdapter.js.map +1 -0
- package/dist/datasets/types.d.ts +40 -0
- package/dist/datasets/types.d.ts.map +1 -0
- package/dist/datasets/types.js +2 -0
- package/dist/datasets/types.js.map +1 -0
- package/dist/datasets/usePreparedDatasetStates.d.ts +16 -0
- package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -0
- package/dist/datasets/usePreparedDatasetStates.js +59 -0
- package/dist/datasets/usePreparedDatasetStates.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/json/colorScaleFunction.d.ts +14 -0
- package/dist/json/colorScaleFunction.d.ts.map +1 -0
- package/dist/json/colorScaleFunction.js +34 -0
- package/dist/json/colorScaleFunction.js.map +1 -0
- package/dist/json/compileColorScale.d.ts +4 -27
- package/dist/json/compileColorScale.d.ts.map +1 -1
- package/dist/json/compileColorScale.js +16 -450
- package/dist/json/compileColorScale.js.map +1 -1
- package/dist/json/compileGeoArrowAccessor.d.ts +7 -0
- package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -1
- package/dist/json/compileGeoArrowAccessor.js +68 -2
- package/dist/json/compileGeoArrowAccessor.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +86 -33
- package/dist/json/createDeckJsonConfiguration.js.map +1 -1
- package/dist/json/defaultClasses.d.ts +12 -6
- package/dist/json/defaultClasses.d.ts.map +1 -1
- package/dist/json/defaultClasses.js +7 -1
- package/dist/json/defaultClasses.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +8 -6
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/layerCompatibility.d.ts +9 -3
- package/dist/json/layerCompatibility.d.ts.map +1 -1
- package/dist/json/layerCompatibility.js +135 -11
- package/dist/json/layerCompatibility.js.map +1 -1
- package/dist/json/layerConfig.d.ts +7 -3
- package/dist/json/layerConfig.d.ts.map +1 -1
- package/dist/json/layerConfig.js +19 -8
- package/dist/json/layerConfig.js.map +1 -1
- package/dist/prepare/detectGeometryColumn.d.ts.map +1 -1
- package/dist/prepare/detectGeometryColumn.js +1 -1
- package/dist/prepare/detectGeometryColumn.js.map +1 -1
- package/dist/prepare/geoarrow.d.ts.map +1 -1
- package/dist/prepare/geoarrow.js.map +1 -1
- package/dist/prepare/geometryDecoder.d.ts +1 -2
- package/dist/prepare/geometryDecoder.d.ts.map +1 -1
- package/dist/prepare/geometryDecoder.js.map +1 -1
- package/dist/prepare/prepareDeckDataset.d.ts +46 -0
- package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
- package/dist/prepare/prepareDeckDataset.js +46 -0
- package/dist/prepare/prepareDeckDataset.js.map +1 -1
- package/dist/prepare/toGeoJsonBinary.d.ts.map +1 -1
- package/dist/prepare/toGeoJsonBinary.js +3 -2
- package/dist/prepare/toGeoJsonBinary.js.map +1 -1
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +36 -9
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/types.d.ts +31 -92
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -1
- package/dist/types.js.map +1 -1
- package/dist/useDeckLayersReadyRedraw.d.ts +13 -0
- package/dist/useDeckLayersReadyRedraw.d.ts.map +1 -0
- package/dist/useDeckLayersReadyRedraw.js +35 -0
- package/dist/useDeckLayersReadyRedraw.js.map +1 -0
- package/package.json +35 -29
- package/dist/ColorScaleLegend.d.ts +0 -8
- package/dist/ColorScaleLegend.d.ts.map +0 -1
- package/dist/ColorScaleLegend.js +0 -11
- package/dist/ColorScaleLegend.js.map +0 -1
- package/dist/DeckMap.d.ts +0 -4
- package/dist/DeckMap.d.ts.map +0 -1
- package/dist/DeckMap.js.map +0 -1
- package/dist/datasets/usePreparedDeckDatasets.d.ts +0 -3
- package/dist/datasets/usePreparedDeckDatasets.d.ts.map +0 -1
- package/dist/datasets/usePreparedDeckDatasets.js +0 -61
- package/dist/datasets/usePreparedDeckDatasets.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Field, FixedSizeList, Float64, Table, vectorFromArray, } from 'apache-arrow';
|
|
2
1
|
import { WKBLoader, WKTLoader } from '@loaders.gl/wkt';
|
|
2
|
+
import { Field, FixedSizeList, Float64, Table, vectorFromArray, } from 'apache-arrow';
|
|
3
3
|
import { buildBinaryGeoJsonData } from './toGeoJsonBinary';
|
|
4
4
|
function toArrayBuffer(value) {
|
|
5
5
|
if (ArrayBuffer.isView(value)) {
|
|
@@ -14,7 +14,9 @@ function parseGeometryValue(value, encoding) {
|
|
|
14
14
|
return null;
|
|
15
15
|
}
|
|
16
16
|
try {
|
|
17
|
-
if (encoding === 'wkt' ||
|
|
17
|
+
if (encoding === 'wkt' ||
|
|
18
|
+
encoding === 'geoarrow.wkt' ||
|
|
19
|
+
(encoding === 'unknown' && typeof value === 'string')) {
|
|
18
20
|
return (WKTLoader.parseTextSync?.(String(value), { wkt: { crs: false } }) ?? null);
|
|
19
21
|
}
|
|
20
22
|
return (WKBLoader.parseSync?.(toArrayBuffer(value), {
|
|
@@ -24,7 +26,7 @@ function parseGeometryValue(value, encoding) {
|
|
|
24
26
|
catch (error) {
|
|
25
27
|
const message = error instanceof Error ? error.message : String(error);
|
|
26
28
|
if (message.includes('WKB: Unsupported geometry type: 0')) {
|
|
27
|
-
throw new Error('DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to
|
|
29
|
+
throw new Error('DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckJsonMap.');
|
|
28
30
|
}
|
|
29
31
|
throw error instanceof Error ? error : new Error(message);
|
|
30
32
|
}
|
|
@@ -42,10 +44,15 @@ function getSampleGeometry(table, columnName, encoding) {
|
|
|
42
44
|
}
|
|
43
45
|
return null;
|
|
44
46
|
}
|
|
45
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Attempt to promote WKB/WKT Point geometries into a native GeoArrow
|
|
49
|
+
* FixedSizeList column. Returns `null` if any non-null geometry is not
|
|
50
|
+
* a Point, so callers can fall back to the GeoJSON binary path.
|
|
51
|
+
*/
|
|
52
|
+
function tryPromotePointTable(table, columnName, encoding) {
|
|
46
53
|
const vector = table.getChild(columnName);
|
|
47
54
|
if (!vector) {
|
|
48
|
-
|
|
55
|
+
return null;
|
|
49
56
|
}
|
|
50
57
|
const points = [];
|
|
51
58
|
for (let rowIndex = 0; rowIndex < table.numRows; rowIndex++) {
|
|
@@ -55,9 +62,21 @@ function createPromotedPointTable(table, columnName, encoding) {
|
|
|
55
62
|
continue;
|
|
56
63
|
}
|
|
57
64
|
if (geometry.type !== 'Point') {
|
|
58
|
-
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
if (!('coordinates' in geometry)) {
|
|
68
|
+
points.push(null);
|
|
69
|
+
continue;
|
|
59
70
|
}
|
|
60
|
-
|
|
71
|
+
const coords = geometry.coordinates;
|
|
72
|
+
if (!Array.isArray(coords) ||
|
|
73
|
+
coords.length < 2 ||
|
|
74
|
+
!Number.isFinite(coords[0]) ||
|
|
75
|
+
!Number.isFinite(coords[1])) {
|
|
76
|
+
points.push(null);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
points.push([coords[0], coords[1]]);
|
|
61
80
|
}
|
|
62
81
|
const coordinateField = new Field('xy', new Float64());
|
|
63
82
|
const geomType = new FixedSizeList(2, coordinateField);
|
|
@@ -83,14 +102,22 @@ export const wkbGeometryDecoder = {
|
|
|
83
102
|
if (!['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(encoding)) {
|
|
84
103
|
return false;
|
|
85
104
|
}
|
|
86
|
-
if (
|
|
105
|
+
if (![
|
|
106
|
+
'GeoArrowScatterplotLayer',
|
|
107
|
+
'GeoArrowHeatmapLayer',
|
|
108
|
+
'GeoArrowColumnLayer',
|
|
109
|
+
].includes(layerType)) {
|
|
87
110
|
return false;
|
|
88
111
|
}
|
|
89
112
|
const sampleGeometry = getSampleGeometry(table, columnName, encoding);
|
|
90
113
|
return sampleGeometry == null || sampleGeometry.type === 'Point';
|
|
91
114
|
},
|
|
92
115
|
toGeoArrowLike(table, columnName, encoding) {
|
|
93
|
-
|
|
116
|
+
const result = tryPromotePointTable(table, columnName, encoding);
|
|
117
|
+
if (!result) {
|
|
118
|
+
throw new Error('GeoArrow promotion failed: column contains non-Point geometries.');
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
94
121
|
},
|
|
95
122
|
toGeoJsonBinary(table, columnName, encoding) {
|
|
96
123
|
return buildBinaryGeoJsonData({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wkbDecoder.js","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Field,\n FixedSizeList,\n Float64,\n Table,\n vectorFromArray,\n} from 'apache-arrow';\nimport type * as arrow from 'apache-arrow';\nimport {WKBLoader, WKTLoader} from '@loaders.gl/wkt';\nimport type {GeometryDecoder, SupportedGeoArrowLayerType} from './geometryDecoder';\nimport type {PreparedGeoArrowLayerData, ResolvedGeometryEncoding} from './types';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\n\nfunction toArrayBuffer(value: unknown) {\n if (ArrayBuffer.isView(value)) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength),\n 0,\n );\n return copy.buffer;\n }\n return value as ArrayBuffer;\n}\n\nfunction parseGeometryValue(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) {\n return null;\n }\n\n try {\n if (encoding === 'wkt' || encoding === 'geoarrow.wkt') {\n return (\n WKTLoader.parseTextSync?.(String(value), {wkt: {crs: false}}) ?? null\n );\n }\n\n return (\n WKBLoader.parseSync?.(toArrayBuffer(value), {\n wkb: {shape: 'geojson-geometry'},\n }) ?? null\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('WKB: Unsupported geometry type: 0')) {\n throw new Error(\n 'DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckMap.',\n );\n }\n\n throw error instanceof Error ? error : new Error(message);\n }\n}\n\nfunction getSampleGeometry(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n) {\n const vector = table.getChild(columnName);\n if (!vector) {\n return null;\n }\n\n for (let rowIndex = 0; rowIndex < table.numRows; rowIndex++) {\n const geometry = parseGeometryValue(vector.get(rowIndex), encoding);\n if (geometry) {\n return geometry;\n }\n }\n\n return null;\n}\n\nfunction createPromotedPointTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData {\n const vector = table.getChild(columnName);\n if (!vector) {\n throw new Error(`Geometry column \"${columnName}\" was not found.`);\n }\n\n const points = [];\n for (let rowIndex = 0; rowIndex < table.numRows; rowIndex++) {\n const geometry = parseGeometryValue(vector.get(rowIndex), encoding);\n if (!geometry) {\n points.push(null);\n continue;\n }\n\n if (geometry.type !== 'Point') {\n throw new Error(\n `Only Point WKB/WKT geometries can be promoted for GeoArrow point layers. Received ${geometry.type}.`,\n );\n }\n\n points.push(geometry.coordinates);\n }\n\n const coordinateField = new Field('xy', new Float64());\n const geomType = new FixedSizeList(2, coordinateField);\n const promotedGeometry = vectorFromArray(points, geomType);\n\n const nextColumns: Record<string, arrow.Vector> = {};\n for (const field of table.schema.fields) {\n nextColumns[field.name] =\n field.name === columnName\n ? promotedGeometry\n : (table.getChild(field.name) as arrow.Vector);\n }\n\n const promotedTable = new Table(nextColumns);\n\n return {\n table: promotedTable,\n geometryColumnName: columnName,\n geometryColumn: promotedTable.getChild(columnName)!,\n encoding: 'geoarrow.point',\n source: 'promoted',\n };\n}\n\nexport const wkbGeometryDecoder: GeometryDecoder = {\n supportsGeoArrowPromotion(\n layerType: SupportedGeoArrowLayerType,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n ) {\n if (\n !['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(\n encoding,\n )\n ) {\n return false;\n }\n\n if (layerType !== 'GeoArrowScatterplotLayer') {\n return false;\n }\n\n const sampleGeometry = getSampleGeometry(table, columnName, encoding);\n return sampleGeometry == null || sampleGeometry.type === 'Point';\n },\n toGeoArrowLike(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n return createPromotedPointTable(table, columnName, encoding);\n },\n toGeoJsonBinary(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: columnName,\n getGeometryAt: (rowIndex) => {\n const value = table.getChild(columnName)?.get(rowIndex);\n return parseGeometryValue(value, encoding);\n },\n });\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"wkbDecoder.js","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import {WKBLoader, WKTLoader} from '@loaders.gl/wkt';\nimport type * as arrow from 'apache-arrow';\nimport {\n Field,\n FixedSizeList,\n Float64,\n Table,\n vectorFromArray,\n} from 'apache-arrow';\nimport type {GeometryDecoder} from './geometryDecoder';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {\n PreparedGeoArrowLayerData,\n ResolvedGeometryEncoding,\n} from './types';\n\nfunction toArrayBuffer(value: unknown) {\n if (ArrayBuffer.isView(value)) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength),\n 0,\n );\n return copy.buffer;\n }\n return value as ArrayBuffer;\n}\n\nfunction parseGeometryValue(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) {\n return null;\n }\n\n try {\n if (\n encoding === 'wkt' ||\n encoding === 'geoarrow.wkt' ||\n (encoding === 'unknown' && typeof value === 'string')\n ) {\n return (\n WKTLoader.parseTextSync?.(String(value), {wkt: {crs: false}}) ?? null\n );\n }\n\n return (\n WKBLoader.parseSync?.(toArrayBuffer(value), {\n wkb: {shape: 'geojson-geometry'},\n }) ?? null\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('WKB: Unsupported geometry type: 0')) {\n throw new Error(\n 'DuckDB GEOMETRY values are not WKB by default. Select ST_AsWKB(geom) AS geom or ST_AsText(geom) AS geom before passing the result to DeckJsonMap.',\n );\n }\n\n throw error instanceof Error ? error : new Error(message);\n }\n}\n\nfunction getSampleGeometry(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n) {\n const vector = table.getChild(columnName);\n if (!vector) {\n return null;\n }\n\n for (let rowIndex = 0; rowIndex < table.numRows; rowIndex++) {\n const geometry = parseGeometryValue(vector.get(rowIndex), encoding);\n if (geometry) {\n return geometry;\n }\n }\n\n return null;\n}\n\n/**\n * Attempt to promote WKB/WKT Point geometries into a native GeoArrow\n * FixedSizeList column. Returns `null` if any non-null geometry is not\n * a Point, so callers can fall back to the GeoJSON binary path.\n */\nfunction tryPromotePointTable(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n): PreparedGeoArrowLayerData | null {\n const vector = table.getChild(columnName);\n if (!vector) {\n return null;\n }\n\n const points = [];\n for (let rowIndex = 0; rowIndex < table.numRows; rowIndex++) {\n const geometry = parseGeometryValue(vector.get(rowIndex), encoding);\n if (!geometry) {\n points.push(null);\n continue;\n }\n\n if (geometry.type !== 'Point') {\n return null;\n }\n\n if (!('coordinates' in geometry)) {\n points.push(null);\n continue;\n }\n\n const coords = geometry.coordinates;\n if (\n !Array.isArray(coords) ||\n coords.length < 2 ||\n !Number.isFinite(coords[0]) ||\n !Number.isFinite(coords[1])\n ) {\n points.push(null);\n continue;\n }\n\n points.push([coords[0], coords[1]]);\n }\n\n const coordinateField = new Field('xy', new Float64());\n const geomType = new FixedSizeList(2, coordinateField);\n const promotedGeometry = vectorFromArray(points, geomType);\n\n const nextColumns: Record<string, arrow.Vector> = {};\n for (const field of table.schema.fields) {\n nextColumns[field.name] =\n field.name === columnName\n ? promotedGeometry\n : (table.getChild(field.name) as arrow.Vector);\n }\n\n const promotedTable = new Table(nextColumns);\n\n return {\n table: promotedTable,\n geometryColumnName: columnName,\n geometryColumn: promotedTable.getChild(columnName)!,\n encoding: 'geoarrow.point',\n source: 'promoted',\n };\n}\n\nexport const wkbGeometryDecoder: GeometryDecoder = {\n supportsGeoArrowPromotion(\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n ) {\n if (\n !['wkb', 'geoarrow.wkb', 'wkt', 'geoarrow.wkt', 'unknown'].includes(\n encoding,\n )\n ) {\n return false;\n }\n\n if (\n ![\n 'GeoArrowScatterplotLayer',\n 'GeoArrowHeatmapLayer',\n 'GeoArrowColumnLayer',\n ].includes(layerType)\n ) {\n return false;\n }\n\n const sampleGeometry = getSampleGeometry(table, columnName, encoding);\n return sampleGeometry == null || sampleGeometry.type === 'Point';\n },\n toGeoArrowLike(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n const result = tryPromotePointTable(table, columnName, encoding);\n if (!result) {\n throw new Error(\n 'GeoArrow promotion failed: column contains non-Point geometries.',\n );\n }\n return result;\n },\n toGeoJsonBinary(\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: columnName,\n getGeometryAt: (rowIndex) => {\n const value = table.getChild(columnName)?.get(rowIndex);\n return parseGeometryValue(value, encoding);\n },\n });\n },\n};\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,18 +1,35 @@
|
|
|
1
|
-
import type { DeckProps } from '@deck.gl/core';
|
|
2
1
|
import type * as arrow from 'apache-arrow';
|
|
3
|
-
import type { ReactNode } from 'react';
|
|
2
|
+
import type { ComponentProps, ReactNode } from 'react';
|
|
3
|
+
import type DeckGLReact from '@deck.gl/react';
|
|
4
4
|
import type { MapProps } from 'react-map-gl/maplibre';
|
|
5
|
+
type DeckProps = ComponentProps<typeof DeckGLReact>;
|
|
5
6
|
import type { GeometryEncodingHint, PreparedDeckDataset } from './prepare/types';
|
|
6
|
-
export type
|
|
7
|
-
|
|
8
|
-
};
|
|
9
|
-
export type DeckDatasetInput = {
|
|
10
|
-
sqlQuery?: string;
|
|
11
|
-
arrowTable?: arrow.Table;
|
|
12
|
-
queryResult?: DeckQueryResultLike;
|
|
7
|
+
export type { ColorScaleFunction, DeckJsonMapLayerSpec, DeckJsonMapSpec, LayerBindingConfig, LayerBindingProps, } from './DeckJsonMapSpec';
|
|
8
|
+
type DeckDatasetBase = {
|
|
13
9
|
geometryColumn?: string;
|
|
14
10
|
geometryEncodingHint?: GeometryEncodingHint;
|
|
15
11
|
};
|
|
12
|
+
export type DeckAutoLayerType = 'GeoJsonLayer' | 'GeoArrowScatterplotLayer' | 'GeoArrowHeatmapLayer' | 'GeoArrowColumnLayer' | 'GeoArrowPathLayer' | 'GeoArrowPolygonLayer' | 'GeoArrowArcLayer' | 'GeoArrowTripsLayer' | 'GeoArrowH3HexagonLayer';
|
|
13
|
+
export type DeckSqlDatasetInput = DeckDatasetBase & {
|
|
14
|
+
sqlQuery: string;
|
|
15
|
+
};
|
|
16
|
+
export type DeckTable = arrow.Table;
|
|
17
|
+
export type DeckArrowTableDatasetInput = DeckDatasetBase & {
|
|
18
|
+
arrowTable: DeckTable | undefined;
|
|
19
|
+
};
|
|
20
|
+
export type DeckDatasetInput = DeckSqlDatasetInput | DeckArrowTableDatasetInput;
|
|
21
|
+
export type DeckJsonSpecDatasetHint = {
|
|
22
|
+
prefer?: 'heatmap';
|
|
23
|
+
type?: DeckAutoLayerType;
|
|
24
|
+
sourceGeometryColumn?: string;
|
|
25
|
+
targetGeometryColumn?: string;
|
|
26
|
+
timestampColumn?: string;
|
|
27
|
+
hexagonColumn?: string;
|
|
28
|
+
};
|
|
29
|
+
export type CreateDeckJsonSpecFromDatasetsOptions = {
|
|
30
|
+
datasets: Record<string, DeckDatasetInput>;
|
|
31
|
+
hints?: Record<string, DeckJsonSpecDatasetHint>;
|
|
32
|
+
};
|
|
16
33
|
export type PreparedDeckDatasetState = {
|
|
17
34
|
status: 'loading';
|
|
18
35
|
} | {
|
|
@@ -22,94 +39,16 @@ export type PreparedDeckDatasetState = {
|
|
|
22
39
|
status: 'error';
|
|
23
40
|
error: Error;
|
|
24
41
|
};
|
|
25
|
-
export type
|
|
26
|
-
export type LayerColorLegendConfig = false | {
|
|
27
|
-
title?: string;
|
|
28
|
-
};
|
|
29
|
-
export type ContinuousSequentialScheme = 'Blues' | 'BuGn' | 'BuPu' | 'Cividis' | 'Cool' | 'CubehelixDefault' | 'GnBu' | 'Greens' | 'Greys' | 'Inferno' | 'Magma' | 'OrRd' | 'Oranges' | 'Plasma' | 'PuBu' | 'PuBuGn' | 'PuRd' | 'Purples' | 'RdPu' | 'Reds' | 'Turbo' | 'Viridis' | 'Warm' | 'YlGn' | 'YlGnBu' | 'YlOrBr' | 'YlOrRd' | 'Rainbow' | 'Sinebow';
|
|
30
|
-
export type ContinuousDivergingScheme = 'BrBG' | 'PRGn' | 'PiYG' | 'PuOr' | 'RdBu' | 'RdGy' | 'RdYlBu' | 'RdYlGn' | 'Spectral';
|
|
31
|
-
export type BinnedNumericScheme = 'Blues' | 'BuGn' | 'BuPu' | 'GnBu' | 'Greens' | 'Greys' | 'OrRd' | 'Oranges' | 'PuBu' | 'PuBuGn' | 'PuRd' | 'Purples' | 'RdPu' | 'Reds' | 'YlGn' | 'YlGnBu' | 'YlOrBr' | 'YlOrRd' | 'BrBG' | 'PRGn' | 'PiYG' | 'PuOr' | 'RdBu' | 'RdGy' | 'RdYlBu' | 'RdYlGn' | 'Spectral';
|
|
32
|
-
export type CategoricalScheme = 'Accent' | 'Dark2' | 'Paired' | 'Pastel1' | 'Pastel2' | 'Set1' | 'Set2' | 'Set3' | 'Tableau10' | 'Observable10' | 'Category10';
|
|
33
|
-
export type LayerColorScale = {
|
|
34
|
-
prop?: LayerColorScaleProp;
|
|
35
|
-
field: string;
|
|
36
|
-
type: 'sequential';
|
|
37
|
-
scheme: ContinuousSequentialScheme;
|
|
38
|
-
domain: 'auto' | [number, number];
|
|
39
|
-
clamp?: boolean;
|
|
40
|
-
reverse?: boolean;
|
|
41
|
-
nullColor?: [number, number, number, number?];
|
|
42
|
-
legend?: LayerColorLegendConfig;
|
|
43
|
-
} | {
|
|
44
|
-
prop?: LayerColorScaleProp;
|
|
45
|
-
field: string;
|
|
46
|
-
type: 'diverging';
|
|
47
|
-
scheme: ContinuousDivergingScheme;
|
|
48
|
-
domain: 'auto' | [number, number, number];
|
|
49
|
-
clamp?: boolean;
|
|
50
|
-
reverse?: boolean;
|
|
51
|
-
nullColor?: [number, number, number, number?];
|
|
52
|
-
legend?: LayerColorLegendConfig;
|
|
53
|
-
} | {
|
|
54
|
-
prop?: LayerColorScaleProp;
|
|
55
|
-
field: string;
|
|
56
|
-
type: 'quantize';
|
|
57
|
-
scheme: BinnedNumericScheme;
|
|
58
|
-
domain: 'auto' | [number, number];
|
|
59
|
-
bins?: number;
|
|
60
|
-
clamp?: boolean;
|
|
61
|
-
reverse?: boolean;
|
|
62
|
-
nullColor?: [number, number, number, number?];
|
|
63
|
-
legend?: LayerColorLegendConfig;
|
|
64
|
-
} | {
|
|
65
|
-
prop?: LayerColorScaleProp;
|
|
66
|
-
field: string;
|
|
67
|
-
type: 'quantile';
|
|
68
|
-
scheme: BinnedNumericScheme;
|
|
69
|
-
bins?: number;
|
|
70
|
-
reverse?: boolean;
|
|
71
|
-
nullColor?: [number, number, number, number?];
|
|
72
|
-
legend?: LayerColorLegendConfig;
|
|
73
|
-
} | {
|
|
74
|
-
prop?: LayerColorScaleProp;
|
|
75
|
-
field: string;
|
|
76
|
-
type: 'threshold';
|
|
77
|
-
scheme: BinnedNumericScheme;
|
|
78
|
-
thresholds: number[];
|
|
79
|
-
reverse?: boolean;
|
|
80
|
-
nullColor?: [number, number, number, number?];
|
|
81
|
-
legend?: LayerColorLegendConfig;
|
|
82
|
-
} | {
|
|
83
|
-
prop?: LayerColorScaleProp;
|
|
84
|
-
field: string;
|
|
85
|
-
type: 'categorical';
|
|
86
|
-
scheme: CategoricalScheme;
|
|
87
|
-
reverse?: boolean;
|
|
88
|
-
unknownColor?: [number, number, number, number?];
|
|
89
|
-
nullColor?: [number, number, number, number?];
|
|
90
|
-
legend?: LayerColorLegendConfig;
|
|
91
|
-
};
|
|
92
|
-
export type LayerExtensionConfig = {
|
|
93
|
-
dataset?: string;
|
|
94
|
-
geometryColumn?: string;
|
|
95
|
-
geometryEncodingHint?: GeometryEncodingHint;
|
|
96
|
-
colorScale?: LayerColorScale;
|
|
97
|
-
};
|
|
98
|
-
export type LayerExtensionProps = {
|
|
99
|
-
_sqlrooms?: LayerExtensionConfig;
|
|
100
|
-
};
|
|
101
|
-
export type DeckMapProps = {
|
|
42
|
+
export type DeckJsonMapProps = {
|
|
102
43
|
spec: string | Record<string, unknown>;
|
|
103
|
-
datasets
|
|
104
|
-
sqlQuery?: string;
|
|
105
|
-
arrowTable?: arrow.Table;
|
|
106
|
-
queryResult?: DeckQueryResultLike;
|
|
107
|
-
geometryColumn?: string;
|
|
108
|
-
geometryEncodingHint?: GeometryEncodingHint;
|
|
44
|
+
datasets: Record<string, DeckDatasetInput>;
|
|
109
45
|
mapStyle?: string;
|
|
110
46
|
deckProps?: Partial<DeckProps>;
|
|
111
47
|
mapProps?: Partial<MapProps>;
|
|
48
|
+
showLegends?: boolean;
|
|
112
49
|
className?: string;
|
|
113
50
|
children?: ReactNode;
|
|
114
51
|
};
|
|
52
|
+
export declare function isSqlDatasetInput(input: DeckDatasetInput): input is DeckSqlDatasetInput;
|
|
53
|
+
export declare function isArrowTableDatasetInput(input: DeckDatasetInput): input is DeckArrowTableDatasetInput;
|
|
115
54
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAC,cAAc,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AACrD,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAEpD,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,CAAC;AACpD,OAAO,KAAK,EAAC,oBAAoB,EAAE,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;AAE/E,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,eAAe,GAAG;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,cAAc,GACd,0BAA0B,GAC1B,sBAAsB,GACtB,qBAAqB,GACrB,mBAAmB,GACnB,sBAAsB,GACtB,kBAAkB,GAClB,oBAAoB,GACpB,wBAAwB,CAAC;AAE7B,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG;IAClD,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AAEpC,MAAM,MAAM,0BAA0B,GAAG,eAAe,GAAG;IACzD,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC;CACnC,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAAG,0BAA0B,CAAC;AAEhF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,qCAAqC,GAAG;IAClD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAChC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAC,GACnB;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAC,GAChD;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAC,CAAC;AAEpC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,gBAAgB,GACtB,KAAK,IAAI,mBAAmB,CAE9B;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,gBAAgB,GACtB,KAAK,IAAI,0BAA0B,CAErC"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAyEA,MAAM,UAAU,iBAAiB,CAC/B,KAAuB;IAEvB,OAAO,UAAU,IAAI,KAAK,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAuB;IAEvB,OAAO,YAAY,IAAI,KAAK,CAAC;AAC/B,CAAC","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport type {ComponentProps, ReactNode} from 'react';\nimport type DeckGLReact from '@deck.gl/react';\nimport type {MapProps} from 'react-map-gl/maplibre';\n\ntype DeckProps = ComponentProps<typeof DeckGLReact>;\nimport type {GeometryEncodingHint, PreparedDeckDataset} from './prepare/types';\n\nexport type {\n ColorScaleFunction,\n DeckJsonMapLayerSpec,\n DeckJsonMapSpec,\n LayerBindingConfig,\n LayerBindingProps,\n} from './DeckJsonMapSpec';\n\ntype DeckDatasetBase = {\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n};\n\nexport type DeckAutoLayerType =\n | 'GeoJsonLayer'\n | 'GeoArrowScatterplotLayer'\n | 'GeoArrowHeatmapLayer'\n | 'GeoArrowColumnLayer'\n | 'GeoArrowPathLayer'\n | 'GeoArrowPolygonLayer'\n | 'GeoArrowArcLayer'\n | 'GeoArrowTripsLayer'\n | 'GeoArrowH3HexagonLayer';\n\nexport type DeckSqlDatasetInput = DeckDatasetBase & {\n sqlQuery: string;\n};\n\nexport type DeckTable = arrow.Table;\n\nexport type DeckArrowTableDatasetInput = DeckDatasetBase & {\n arrowTable: DeckTable | undefined;\n};\nexport type DeckDatasetInput = DeckSqlDatasetInput | DeckArrowTableDatasetInput;\n\nexport type DeckJsonSpecDatasetHint = {\n prefer?: 'heatmap';\n type?: DeckAutoLayerType;\n sourceGeometryColumn?: string;\n targetGeometryColumn?: string;\n timestampColumn?: string;\n hexagonColumn?: string;\n};\n\nexport type CreateDeckJsonSpecFromDatasetsOptions = {\n datasets: Record<string, DeckDatasetInput>;\n hints?: Record<string, DeckJsonSpecDatasetHint>;\n};\n\nexport type PreparedDeckDatasetState =\n | {status: 'loading'}\n | {status: 'ready'; prepared: PreparedDeckDataset}\n | {status: 'error'; error: Error};\n\nexport type DeckJsonMapProps = {\n spec: string | Record<string, unknown>;\n datasets: Record<string, DeckDatasetInput>;\n mapStyle?: string;\n deckProps?: Partial<DeckProps>;\n mapProps?: Partial<MapProps>;\n showLegends?: boolean;\n className?: string;\n children?: ReactNode;\n};\n\nexport function isSqlDatasetInput(\n input: DeckDatasetInput,\n): input is DeckSqlDatasetInput {\n return 'sqlQuery' in input;\n}\n\nexport function isArrowTableDatasetInput(\n input: DeckDatasetInput,\n): input is DeckArrowTableDatasetInput {\n return 'arrowTable' in input;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DeckGLRef } from '@deck.gl/react';
|
|
2
|
+
import type { RefObject } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Schedule a post-layer redraw once meaningful layers are available, while
|
|
5
|
+
* ignoring reference-only layer array churn. DeckGL still receives the latest
|
|
6
|
+
* `layers` prop; the shallow-stable value is only for this effect dependency.
|
|
7
|
+
*/
|
|
8
|
+
export declare function useDeckLayersReadyRedraw({ deckRef, hasRenderingError, layers, }: {
|
|
9
|
+
deckRef: RefObject<DeckGLRef | null>;
|
|
10
|
+
hasRenderingError: boolean;
|
|
11
|
+
layers: readonly unknown[];
|
|
12
|
+
}): void;
|
|
13
|
+
//# sourceMappingURL=useDeckLayersReadyRedraw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDeckLayersReadyRedraw.d.ts","sourceRoot":"","sources":["../src/useDeckLayersReadyRedraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAcrC;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,iBAAiB,EACjB,MAAM,GACP,EAAE;IACD,OAAO,EAAE,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CAC5B,QAsBA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { shallow } from 'zustand/shallow';
|
|
3
|
+
function useShallowStableArray(value) {
|
|
4
|
+
const [stableValue, setStableValue] = useState(value);
|
|
5
|
+
if (!shallow(stableValue, value)) {
|
|
6
|
+
setStableValue(value);
|
|
7
|
+
}
|
|
8
|
+
return stableValue;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Schedule a post-layer redraw once meaningful layers are available, while
|
|
12
|
+
* ignoring reference-only layer array churn. DeckGL still receives the latest
|
|
13
|
+
* `layers` prop; the shallow-stable value is only for this effect dependency.
|
|
14
|
+
*/
|
|
15
|
+
export function useDeckLayersReadyRedraw({ deckRef, hasRenderingError, layers, }) {
|
|
16
|
+
const stableLayers = useShallowStableArray(layers);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (hasRenderingError || stableLayers.length === 0) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
let secondFrame = null;
|
|
22
|
+
const firstFrame = requestAnimationFrame(() => {
|
|
23
|
+
secondFrame = requestAnimationFrame(() => {
|
|
24
|
+
deckRef.current?.deck?.redraw('SQLRooms layers ready');
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
return () => {
|
|
28
|
+
cancelAnimationFrame(firstFrame);
|
|
29
|
+
if (secondFrame !== null) {
|
|
30
|
+
cancelAnimationFrame(secondFrame);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}, [deckRef, hasRenderingError, stableLayers]);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=useDeckLayersReadyRedraw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDeckLayersReadyRedraw.js","sourceRoot":"","sources":["../src/useDeckLayersReadyRedraw.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAExC,SAAS,qBAAqB,CAA+B,KAAQ;IACnE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;QACjC,cAAc,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,OAAO,EACP,iBAAiB,EACjB,MAAM,GAKP;IACC,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAEnD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,EAAE;YAC5C,WAAW,GAAG,qBAAqB,CAAC,GAAG,EAAE;gBACvC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,uBAAuB,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACjC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,oBAAoB,CAAC,WAAW,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;AACjD,CAAC","sourcesContent":["import type {DeckGLRef} from '@deck.gl/react';\nimport type {RefObject} from 'react';\nimport {useEffect, useState} from 'react';\nimport {shallow} from 'zustand/shallow';\n\nfunction useShallowStableArray<T extends readonly unknown[]>(value: T) {\n const [stableValue, setStableValue] = useState(value);\n\n if (!shallow(stableValue, value)) {\n setStableValue(value);\n }\n\n return stableValue;\n}\n\n/**\n * Schedule a post-layer redraw once meaningful layers are available, while\n * ignoring reference-only layer array churn. DeckGL still receives the latest\n * `layers` prop; the shallow-stable value is only for this effect dependency.\n */\nexport function useDeckLayersReadyRedraw({\n deckRef,\n hasRenderingError,\n layers,\n}: {\n deckRef: RefObject<DeckGLRef | null>;\n hasRenderingError: boolean;\n layers: readonly unknown[];\n}) {\n const stableLayers = useShallowStableArray(layers);\n\n useEffect(() => {\n if (hasRenderingError || stableLayers.length === 0) {\n return;\n }\n\n let secondFrame: number | null = null;\n const firstFrame = requestAnimationFrame(() => {\n secondFrame = requestAnimationFrame(() => {\n deckRef.current?.deck?.redraw('SQLRooms layers ready');\n });\n });\n\n return () => {\n cancelAnimationFrame(firstFrame);\n if (secondFrame !== null) {\n cancelAnimationFrame(secondFrame);\n }\n };\n }, [deckRef, hasRenderingError, stableLayers]);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,40 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/deck",
|
|
3
|
-
"version": "0.29.0-rc.
|
|
4
|
-
"main": "dist/index.js",
|
|
5
|
-
"types": "dist/index.d.ts",
|
|
6
|
-
"module": "dist/index.js",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"sideEffects": [
|
|
9
|
-
"**/*.css"
|
|
10
|
-
],
|
|
11
|
-
"author": "SQLRooms Contributors",
|
|
12
|
-
"license": "MIT",
|
|
3
|
+
"version": "0.29.0-rc.4",
|
|
13
4
|
"repository": {
|
|
14
5
|
"type": "git",
|
|
15
6
|
"url": "git+https://github.com/sqlrooms/sqlrooms.git"
|
|
16
7
|
},
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"author": "SQLRooms Contributors",
|
|
10
|
+
"sideEffects": [
|
|
11
|
+
"**/*.css"
|
|
12
|
+
],
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "dist/index.js",
|
|
15
|
+
"module": "dist/index.js",
|
|
16
|
+
"types": "dist/index.d.ts",
|
|
17
17
|
"files": [
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
|
-
"
|
|
21
|
-
"
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"dev": "tsc -w",
|
|
23
|
+
"lint": "eslint .",
|
|
24
|
+
"test": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest",
|
|
25
|
+
"test:watch": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest --watch",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"typedoc": "typedoc"
|
|
22
28
|
},
|
|
23
29
|
"dependencies": {
|
|
24
|
-
"@deck.gl/core": "^9.
|
|
25
|
-
"@deck.gl/json": "^9.
|
|
26
|
-
"@deck.gl/layers": "^9.
|
|
27
|
-
"@deck.gl/react": "^9.
|
|
30
|
+
"@deck.gl/core": "^9.3.1",
|
|
31
|
+
"@deck.gl/json": "^9.3.1",
|
|
32
|
+
"@deck.gl/layers": "^9.3.1",
|
|
33
|
+
"@deck.gl/react": "^9.3.1",
|
|
28
34
|
"@geoarrow/deck.gl-layers": "0.3.2",
|
|
29
35
|
"@loaders.gl/core": "^4.4.1",
|
|
30
36
|
"@loaders.gl/geoarrow": "^4.4.1",
|
|
31
37
|
"@loaders.gl/gis": "^4.4.1",
|
|
32
38
|
"@loaders.gl/wkt": "^4.4.1",
|
|
33
|
-
"@
|
|
34
|
-
"@sqlrooms/
|
|
35
|
-
"@sqlrooms/
|
|
39
|
+
"@paralleldrive/cuid2": "^3.0.0",
|
|
40
|
+
"@sqlrooms/color-scales": "0.29.0-rc.4",
|
|
41
|
+
"@sqlrooms/duckdb": "0.29.0-rc.4",
|
|
42
|
+
"@sqlrooms/mosaic": "0.29.0-rc.4",
|
|
43
|
+
"@sqlrooms/ui": "0.29.0-rc.4",
|
|
44
|
+
"@uwdata/mosaic-core": "^0.21.0",
|
|
45
|
+
"@uwdata/mosaic-sql": "^0.21.0",
|
|
46
|
+
"lucide-react": "^0.555.0",
|
|
36
47
|
"maplibre-gl": "^5.12.0",
|
|
37
|
-
"react-map-gl": "^8.1.
|
|
48
|
+
"react-map-gl": "^8.1.1",
|
|
38
49
|
"zod": "^4.1.8",
|
|
39
50
|
"zustand": "^5.0.8"
|
|
40
51
|
},
|
|
@@ -50,13 +61,8 @@
|
|
|
50
61
|
"react": ">=18",
|
|
51
62
|
"react-dom": ">=18"
|
|
52
63
|
},
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"typecheck": "tsc --noEmit",
|
|
58
|
-
"typedoc": "typedoc",
|
|
59
|
-
"test": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest",
|
|
60
|
-
"test:watch": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest --watch"
|
|
61
|
-
}
|
|
64
|
+
"publishConfig": {
|
|
65
|
+
"access": "public"
|
|
66
|
+
},
|
|
67
|
+
"gitHead": "8694bab9d3d915a06d28675ad801b21444bcc55f"
|
|
62
68
|
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { ResolvedColorLegend } from './json/compileColorScale';
|
|
2
|
-
type ColorScaleLegendProps = {
|
|
3
|
-
legends: ResolvedColorLegend[];
|
|
4
|
-
className?: string;
|
|
5
|
-
};
|
|
6
|
-
export declare function ColorScaleLegend({ legends, className }: ColorScaleLegendProps): import("react/jsx-runtime").JSX.Element | null;
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=ColorScaleLegend.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ColorScaleLegend.d.ts","sourceRoot":"","sources":["../src/ColorScaleLegend.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAElE,KAAK,qBAAqB,GAAG;IAC3B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAC,OAAO,EAAE,SAAS,EAAC,EAAE,qBAAqB,kDA8D3E"}
|
package/dist/ColorScaleLegend.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { cn } from '@sqlrooms/ui';
|
|
3
|
-
export function ColorScaleLegend({ legends, className }) {
|
|
4
|
-
if (!legends.length) {
|
|
5
|
-
return null;
|
|
6
|
-
}
|
|
7
|
-
return (_jsx("div", { className: cn('pointer-events-none absolute bottom-2 left-2 z-10 flex max-w-56 flex-col gap-3', className), children: legends.map((legend) => (_jsxs("div", { className: "bg-background/70 rounded-md px-3 py-2 shadow-sm backdrop-blur-sm", children: [_jsx("div", { className: "text-foreground mb-2 text-xs font-semibold", children: legend.title }), legend.type === 'continuous' ? (_jsxs("div", { children: [_jsx("div", { className: "h-3 rounded-sm border", style: { background: legend.gradient } }), _jsx("div", { className: "text-muted-foreground mt-1 flex justify-between gap-2 text-[0.6rem]", children: legend.ticks.map((tick) => (_jsx("span", { className: cn(tick.offset === 50 ? 'text-center' : '', tick.offset === 100 ? 'text-right' : ''), children: tick.label }, `${legend.title}-${tick.offset}-${tick.label}`))) })] })) : (_jsx("div", { className: "space-y-1.5", children: legend.items.map((item) => (_jsxs("div", { className: "text-foreground flex items-center gap-2 text-xs", children: [_jsx("span", { className: "h-3 w-3 rounded-sm border", style: {
|
|
8
|
-
backgroundColor: `rgba(${item.color[0]}, ${item.color[1]}, ${item.color[2]}, ${item.color[3] / 255})`,
|
|
9
|
-
} }), _jsx("span", { className: "truncate", children: item.label })] }, `${legend.title}-${item.label}`))) }))] }, `${legend.title}-${legend.type}`))) }));
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=ColorScaleLegend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ColorScaleLegend.js","sourceRoot":"","sources":["../src/ColorScaleLegend.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAQhC,MAAM,UAAU,gBAAgB,CAAC,EAAC,OAAO,EAAE,SAAS,EAAwB;IAC1E,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,gFAAgF,EAChF,SAAS,CACV,YAEA,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,eAEE,SAAS,EAAC,kEAAkE,aAE5E,cAAK,SAAS,EAAC,4CAA4C,YACxD,MAAM,CAAC,KAAK,GACT,EACL,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,CAC9B,0BACE,cACE,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE,EAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAC,GACpC,EACF,cAAK,SAAS,EAAC,qEAAqE,YACjF,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC1B,eAEE,SAAS,EAAE,EAAE,CACX,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EACvC,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CACxC,YAEA,IAAI,CAAC,KAAK,IANN,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAO9C,CACR,CAAC,GACE,IACF,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,aAAa,YACzB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC1B,eAEE,SAAS,EAAC,iDAAiD,aAE3D,eACE,SAAS,EAAC,2BAA2B,EACrC,KAAK,EAAE;oCACL,eAAe,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG;iCACtG,GACD,EACF,eAAM,SAAS,EAAC,UAAU,YAAE,IAAI,CAAC,KAAK,GAAQ,KATzC,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAUhC,CACP,CAAC,GACE,CACP,KA3CI,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CA4CjC,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["import {cn} from '@sqlrooms/ui';\nimport type {ResolvedColorLegend} from './json/compileColorScale';\n\ntype ColorScaleLegendProps = {\n legends: ResolvedColorLegend[];\n className?: string;\n};\n\nexport function ColorScaleLegend({legends, className}: ColorScaleLegendProps) {\n if (!legends.length) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'pointer-events-none absolute bottom-2 left-2 z-10 flex max-w-56 flex-col gap-3',\n className,\n )}\n >\n {legends.map((legend) => (\n <div\n key={`${legend.title}-${legend.type}`}\n className=\"bg-background/70 rounded-md px-3 py-2 shadow-sm backdrop-blur-sm\"\n >\n <div className=\"text-foreground mb-2 text-xs font-semibold\">\n {legend.title}\n </div>\n {legend.type === 'continuous' ? (\n <div>\n <div\n className=\"h-3 rounded-sm border\"\n style={{background: legend.gradient}}\n />\n <div className=\"text-muted-foreground mt-1 flex justify-between gap-2 text-[0.6rem]\">\n {legend.ticks.map((tick) => (\n <span\n key={`${legend.title}-${tick.offset}-${tick.label}`}\n className={cn(\n tick.offset === 50 ? 'text-center' : '',\n tick.offset === 100 ? 'text-right' : '',\n )}\n >\n {tick.label}\n </span>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n {legend.items.map((item) => (\n <div\n key={`${legend.title}-${item.label}`}\n className=\"text-foreground flex items-center gap-2 text-xs\"\n >\n <span\n className=\"h-3 w-3 rounded-sm border\"\n style={{\n backgroundColor: `rgba(${item.color[0]}, ${item.color[1]}, ${item.color[2]}, ${item.color[3] / 255})`,\n }}\n />\n <span className=\"truncate\">{item.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\n"]}
|
package/dist/DeckMap.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import 'maplibre-gl/dist/maplibre-gl.css';
|
|
2
|
-
import type { DeckMapProps } from './types';
|
|
3
|
-
export declare function DeckMap({ spec, datasets, sqlQuery, arrowTable, queryResult, geometryColumn, geometryEncodingHint, mapStyle, deckProps, mapProps, className, children, }: DeckMapProps): import("react/jsx-runtime").JSX.Element;
|
|
4
|
-
//# sourceMappingURL=DeckMap.d.ts.map
|
package/dist/DeckMap.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeckMap.d.ts","sourceRoot":"","sources":["../src/DeckMap.tsx"],"names":[],"mappings":"AAGA,OAAO,kCAAkC,CAAC;AAU1C,OAAO,KAAK,EAAC,YAAY,EAA2B,MAAM,SAAS,CAAC;AA6GpE,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE,YAAY,2CAgId"}
|
package/dist/DeckMap.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeckMap.js","sourceRoot":"","sources":["../src/DeckMap.tsx"],"names":[],"mappings":"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","sourcesContent":["import {JSONConverter} from '@deck.gl/json';\nimport DeckGL from '@deck.gl/react';\nimport {cn} from '@sqlrooms/ui';\nimport 'maplibre-gl/dist/maplibre-gl.css';\nimport {useEffect, useMemo} from 'react';\nimport Map from 'react-map-gl/maplibre';\nimport {normalizeDatasets} from './datasets/normalizeDatasets';\nimport {usePreparedDeckDatasets} from './datasets/usePreparedDeckDatasets';\nimport {ColorScaleLegend} from './ColorScaleLegend';\nimport {createDeckJsonConfiguration} from './json/createDeckJsonConfiguration';\nimport {extractColorScaleLegends} from './json/extractColorScaleLegends';\nimport {resolveDatasetId} from './json/layerConfig';\nimport {getLayerCompatibility} from './json/layerCompatibility';\nimport type {DeckMapProps, PreparedDeckDatasetState} from './types';\n\nconst DEFAULT_MAP_STYLE =\n 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json';\n\nfunction parseSpec(spec: DeckMapProps['spec']) {\n try {\n return {\n spec: typeof spec === 'string' ? JSON.parse(spec) : spec,\n error: null,\n };\n } catch (error) {\n return {\n spec: null,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\nfunction extractFallbackDeckProps(spec: Record<string, unknown> | null) {\n if (!spec) {\n return {};\n }\n\n const fallbackProps: Record<string, unknown> = {};\n for (const key of ['initialViewState', 'viewState', 'controller']) {\n if (key in spec) {\n fallbackProps[key] = spec[key];\n }\n }\n\n return fallbackProps;\n}\n\nfunction filterUnavailableLayers(\n spec: Record<string, unknown>,\n datasetIds: string[],\n datasetStates: Record<string, PreparedDeckDatasetState>,\n) {\n const layers = Array.isArray(spec.layers) ? spec.layers : [];\n const filteredLayers = layers.filter((layer) => {\n if (!layer || typeof layer !== 'object') {\n return true;\n }\n\n const layerProps = layer as Record<string, unknown>;\n const layerName = String(layerProps['@@type'] ?? '');\n const compatibility = getLayerCompatibility(layerName);\n if (!compatibility) {\n return true;\n }\n\n const datasetId = resolveDatasetId(layerProps, datasetIds);\n if (!datasetId) {\n return true;\n }\n\n const datasetState = datasetStates[datasetId];\n if (!datasetState) {\n return false;\n }\n\n return datasetState.status === 'ready';\n });\n\n return {\n ...spec,\n layers: filteredLayers,\n };\n}\n\nfunction renderDatasetStatusOverlay(\n datasetStates: Record<string, PreparedDeckDatasetState>,\n) {\n const loadingDatasets = Object.entries(datasetStates)\n .filter(([, state]) => state.status === 'loading')\n .map(([datasetId]) => datasetId);\n const failedDatasets = Object.entries(datasetStates).filter(\n (\n entry,\n ): entry is [\n string,\n Extract<PreparedDeckDatasetState, {status: 'error'}>,\n ] => entry[1].status === 'error',\n );\n\n if (!loadingDatasets.length && !failedDatasets.length) {\n return null;\n }\n\n return (\n <div className=\"pointer-events-none absolute inset-x-4 top-4 z-10 space-y-2\">\n {loadingDatasets.length > 0 ? (\n <div className=\"rounded-md border border-black/10 bg-white/90 px-3 py-2 text-sm text-slate-700 shadow-sm\">\n Loading datasets: {loadingDatasets.join(', ')}\n </div>\n ) : null}\n {failedDatasets.map(([datasetId, state]) => (\n <div\n key={datasetId}\n className=\"rounded-md border border-red-200 bg-red-50/95 px-3 py-2 text-sm text-red-700 shadow-sm\"\n >\n {`Dataset \"${datasetId}\" failed: ${state.error.message}`}\n </div>\n ))}\n </div>\n );\n}\n\nexport function DeckMap({\n spec,\n datasets,\n sqlQuery,\n arrowTable,\n queryResult,\n geometryColumn,\n geometryEncodingHint,\n mapStyle,\n deckProps,\n mapProps,\n className,\n children,\n}: DeckMapProps) {\n const normalizedDatasets = useMemo(\n () =>\n normalizeDatasets({\n datasets,\n sqlQuery,\n arrowTable,\n queryResult,\n geometryColumn,\n geometryEncodingHint,\n }),\n [\n datasets,\n sqlQuery,\n arrowTable,\n queryResult,\n geometryColumn,\n geometryEncodingHint,\n ],\n );\n const datasetIds = useMemo(\n () => Object.keys(normalizedDatasets),\n [normalizedDatasets],\n );\n const datasetStates = usePreparedDeckDatasets(normalizedDatasets);\n\n const {spec: parsedSpec, error: specError} = useMemo(\n () => parseSpec(spec),\n [spec],\n );\n\n const availableSpec = useMemo(\n () =>\n parsedSpec\n ? filterUnavailableLayers(parsedSpec, datasetIds, datasetStates)\n : null,\n [parsedSpec, datasetIds, datasetStates],\n );\n\n const converter = useMemo(\n () =>\n new JSONConverter({\n configuration: createDeckJsonConfiguration({\n datasetStates,\n datasetIds,\n }),\n onJSONChange: () => {},\n }),\n [datasetIds, datasetStates],\n );\n\n const convertedDeckPropsResult = useMemo(() => {\n if (!availableSpec) {\n return {props: null, error: specError};\n }\n\n try {\n return {\n props: converter.convert(availableSpec) as Record<string, unknown>,\n error: null,\n };\n } catch (error) {\n return {\n props: null,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }, [availableSpec, converter, specError]);\n\n useEffect(() => {\n if (convertedDeckPropsResult.error) {\n console.error(convertedDeckPropsResult.error);\n }\n }, [convertedDeckPropsResult.error]);\n\n const fallbackDeckProps = useMemo(\n () => extractFallbackDeckProps(availableSpec),\n [availableSpec],\n );\n const convertedDeckProps = (convertedDeckPropsResult.props ??\n fallbackDeckProps ??\n {}) as Record<string, unknown>;\n const extraDeckProps = (deckProps ?? {}) as Record<string, unknown>;\n const extraMapProps = (mapProps ?? {}) as Record<string, unknown>;\n const hasRenderingError = Boolean(convertedDeckPropsResult.error);\n\n const mergedDeckProps = {\n ...convertedDeckProps,\n ...extraDeckProps,\n layers: hasRenderingError\n ? []\n : (deckProps?.layers ??\n (convertedDeckProps.layers as unknown[] | undefined) ??\n []),\n };\n\n const mergedMapProps = {\n ...extraMapProps,\n mapStyle: mapStyle ?? mapProps?.mapStyle ?? DEFAULT_MAP_STYLE,\n };\n const legends = useMemo(\n () =>\n extractColorScaleLegends({\n spec: availableSpec,\n datasetIds,\n datasetStates,\n }),\n [availableSpec, datasetIds, datasetStates],\n );\n\n return (\n <div className={cn('relative h-full w-full', className)}>\n {hasRenderingError ? (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center p-4\">\n <div className=\"max-w-sm rounded-md border border-red-200 bg-red-50/95 p-4 text-sm text-red-700 shadow-sm\">\n {`Map couldn't be rendered. Check the console for details.`}\n </div>\n </div>\n ) : null}\n\n <DeckGL {...(mergedDeckProps as object)}>\n <Map {...(mergedMapProps as object)}>{children}</Map>\n </DeckGL>\n\n {renderDatasetStatusOverlay(datasetStates)}\n {!hasRenderingError ? <ColorScaleLegend legends={legends} /> : null}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usePreparedDeckDatasets.d.ts","sourceRoot":"","sources":["../../src/datasets/usePreparedDeckDatasets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,gBAAgB,EAAE,wBAAwB,EAAC,MAAM,UAAU,CAAC;AAIzE,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACzC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAqE1C"}
|