@sqlrooms/deck 0.29.0-rc.2 → 0.29.0-rc.3

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 (123) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +69 -0
  3. package/dist/DeckJsonMap.d.ts +4 -0
  4. package/dist/DeckJsonMap.d.ts.map +1 -0
  5. package/dist/{DeckMap.js → DeckJsonMap.js} +57 -44
  6. package/dist/DeckJsonMap.js.map +1 -0
  7. package/dist/DeckJsonMapSpec.d.ts +7617 -0
  8. package/dist/DeckJsonMapSpec.d.ts.map +1 -0
  9. package/dist/DeckJsonMapSpec.js +81 -0
  10. package/dist/DeckJsonMapSpec.js.map +1 -0
  11. package/dist/DeckMapConfigPopoverEditor.d.ts +8 -0
  12. package/dist/DeckMapConfigPopoverEditor.d.ts.map +1 -0
  13. package/dist/DeckMapConfigPopoverEditor.js +43 -0
  14. package/dist/DeckMapConfigPopoverEditor.js.map +1 -0
  15. package/dist/createDeckJsonSpecFromDatasets.d.ts +11 -0
  16. package/dist/createDeckJsonSpecFromDatasets.d.ts.map +1 -0
  17. package/dist/createDeckJsonSpecFromDatasets.js +85 -0
  18. package/dist/createDeckJsonSpecFromDatasets.js.map +1 -0
  19. package/dist/dashboard.d.ts +4 -0
  20. package/dist/dashboard.d.ts.map +1 -0
  21. package/dist/dashboard.js +465 -0
  22. package/dist/dashboard.js.map +1 -0
  23. package/dist/dashboardConfig.d.ts +51 -0
  24. package/dist/dashboardConfig.d.ts.map +1 -0
  25. package/dist/dashboardConfig.js +54 -0
  26. package/dist/dashboardConfig.js.map +1 -0
  27. package/dist/datasets/PreparedDatasetStore.d.ts +120 -0
  28. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -0
  29. package/dist/datasets/PreparedDatasetStore.js +262 -0
  30. package/dist/datasets/PreparedDatasetStore.js.map +1 -0
  31. package/dist/datasets/helpers.d.ts +57 -0
  32. package/dist/datasets/helpers.d.ts.map +1 -0
  33. package/dist/datasets/helpers.js +146 -0
  34. package/dist/datasets/helpers.js.map +1 -0
  35. package/dist/datasets/normalizeDatasets.d.ts +8 -2
  36. package/dist/datasets/normalizeDatasets.d.ts.map +1 -1
  37. package/dist/datasets/normalizeDatasets.js +33 -48
  38. package/dist/datasets/normalizeDatasets.js.map +1 -1
  39. package/dist/datasets/tableAdapter.d.ts +11 -0
  40. package/dist/datasets/tableAdapter.d.ts.map +1 -0
  41. package/dist/datasets/tableAdapter.js +11 -0
  42. package/dist/datasets/tableAdapter.js.map +1 -0
  43. package/dist/datasets/types.d.ts +40 -0
  44. package/dist/datasets/types.d.ts.map +1 -0
  45. package/dist/datasets/types.js +2 -0
  46. package/dist/datasets/types.js.map +1 -0
  47. package/dist/datasets/usePreparedDatasetStates.d.ts +16 -0
  48. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -0
  49. package/dist/datasets/usePreparedDatasetStates.js +59 -0
  50. package/dist/datasets/usePreparedDatasetStates.js.map +1 -0
  51. package/dist/index.d.ts +10 -3
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +7 -2
  54. package/dist/index.js.map +1 -1
  55. package/dist/json/colorScaleFunction.d.ts +14 -0
  56. package/dist/json/colorScaleFunction.d.ts.map +1 -0
  57. package/dist/json/colorScaleFunction.js +34 -0
  58. package/dist/json/colorScaleFunction.js.map +1 -0
  59. package/dist/json/compileColorScale.d.ts +4 -27
  60. package/dist/json/compileColorScale.d.ts.map +1 -1
  61. package/dist/json/compileColorScale.js +16 -450
  62. package/dist/json/compileColorScale.js.map +1 -1
  63. package/dist/json/compileGeoArrowAccessor.d.ts +7 -0
  64. package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -1
  65. package/dist/json/compileGeoArrowAccessor.js +68 -2
  66. package/dist/json/compileGeoArrowAccessor.js.map +1 -1
  67. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
  68. package/dist/json/createDeckJsonConfiguration.js +86 -33
  69. package/dist/json/createDeckJsonConfiguration.js.map +1 -1
  70. package/dist/json/defaultClasses.d.ts +12 -6
  71. package/dist/json/defaultClasses.d.ts.map +1 -1
  72. package/dist/json/defaultClasses.js +7 -1
  73. package/dist/json/defaultClasses.js.map +1 -1
  74. package/dist/json/extractColorScaleLegends.d.ts +1 -1
  75. package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
  76. package/dist/json/extractColorScaleLegends.js +8 -6
  77. package/dist/json/extractColorScaleLegends.js.map +1 -1
  78. package/dist/json/layerCompatibility.d.ts +9 -3
  79. package/dist/json/layerCompatibility.d.ts.map +1 -1
  80. package/dist/json/layerCompatibility.js +135 -11
  81. package/dist/json/layerCompatibility.js.map +1 -1
  82. package/dist/json/layerConfig.d.ts +7 -3
  83. package/dist/json/layerConfig.d.ts.map +1 -1
  84. package/dist/json/layerConfig.js +19 -8
  85. package/dist/json/layerConfig.js.map +1 -1
  86. package/dist/prepare/detectGeometryColumn.d.ts.map +1 -1
  87. package/dist/prepare/detectGeometryColumn.js +1 -1
  88. package/dist/prepare/detectGeometryColumn.js.map +1 -1
  89. package/dist/prepare/geoarrow.d.ts.map +1 -1
  90. package/dist/prepare/geoarrow.js.map +1 -1
  91. package/dist/prepare/geometryDecoder.d.ts +1 -2
  92. package/dist/prepare/geometryDecoder.d.ts.map +1 -1
  93. package/dist/prepare/geometryDecoder.js.map +1 -1
  94. package/dist/prepare/prepareDeckDataset.d.ts +46 -0
  95. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
  96. package/dist/prepare/prepareDeckDataset.js +46 -0
  97. package/dist/prepare/prepareDeckDataset.js.map +1 -1
  98. package/dist/prepare/toGeoJsonBinary.d.ts.map +1 -1
  99. package/dist/prepare/toGeoJsonBinary.js +3 -2
  100. package/dist/prepare/toGeoJsonBinary.js.map +1 -1
  101. package/dist/prepare/wkbDecoder.d.ts.map +1 -1
  102. package/dist/prepare/wkbDecoder.js +36 -9
  103. package/dist/prepare/wkbDecoder.js.map +1 -1
  104. package/dist/types.d.ts +31 -92
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/types.js +6 -1
  107. package/dist/types.js.map +1 -1
  108. package/dist/useDeckLayersReadyRedraw.d.ts +13 -0
  109. package/dist/useDeckLayersReadyRedraw.d.ts.map +1 -0
  110. package/dist/useDeckLayersReadyRedraw.js +35 -0
  111. package/dist/useDeckLayersReadyRedraw.js.map +1 -0
  112. package/package.json +16 -10
  113. package/dist/ColorScaleLegend.d.ts +0 -8
  114. package/dist/ColorScaleLegend.d.ts.map +0 -1
  115. package/dist/ColorScaleLegend.js +0 -11
  116. package/dist/ColorScaleLegend.js.map +0 -1
  117. package/dist/DeckMap.d.ts +0 -4
  118. package/dist/DeckMap.d.ts.map +0 -1
  119. package/dist/DeckMap.js.map +0 -1
  120. package/dist/datasets/usePreparedDeckDatasets.d.ts +0 -3
  121. package/dist/datasets/usePreparedDeckDatasets.d.ts.map +0 -1
  122. package/dist/datasets/usePreparedDeckDatasets.js +0 -61
  123. 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' || encoding === 'geoarrow.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 DeckMap.');
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
- function createPromotedPointTable(table, columnName, encoding) {
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
- throw new Error(`Geometry column "${columnName}" was not found.`);
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
- throw new Error(`Only Point WKB/WKT geometries can be promoted for GeoArrow point layers. Received ${geometry.type}.`);
65
+ return null;
66
+ }
67
+ if (!('coordinates' in geometry)) {
68
+ points.push(null);
69
+ continue;
59
70
  }
60
- points.push(geometry.coordinates);
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 (layerType !== 'GeoArrowScatterplotLayer') {
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
- return createPromotedPointTable(table, columnName, encoding);
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 DeckQueryResultLike = {
7
- arrowTable?: arrow.Table | undefined;
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 LayerColorScaleProp = 'getFillColor' | 'getLineColor';
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?: Record<string, DeckDatasetInput>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
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
@@ -1,2 +1,7 @@
1
- export {};
1
+ export function isSqlDatasetInput(input) {
2
+ return 'sqlQuery' in input;
3
+ }
4
+ export function isArrowTableDatasetInput(input) {
5
+ return 'arrowTable' in input;
6
+ }
2
7
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {DeckProps} from '@deck.gl/core';\nimport type * as arrow from 'apache-arrow';\nimport type {ReactNode} from 'react';\nimport type {MapProps} from 'react-map-gl/maplibre';\nimport type {GeometryEncodingHint, PreparedDeckDataset} from './prepare/types';\n\nexport type DeckQueryResultLike = {\n arrowTable?: arrow.Table | undefined;\n};\n\nexport type DeckDatasetInput = {\n sqlQuery?: string;\n arrowTable?: arrow.Table;\n queryResult?: DeckQueryResultLike;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n};\n\nexport type PreparedDeckDatasetState =\n | {status: 'loading'}\n | {status: 'ready'; prepared: PreparedDeckDataset}\n | {status: 'error'; error: Error};\n\nexport type LayerColorScaleProp = 'getFillColor' | 'getLineColor';\nexport type LayerColorLegendConfig =\n | false\n | {\n title?: string;\n };\n\nexport type ContinuousSequentialScheme =\n | 'Blues'\n | 'BuGn'\n | 'BuPu'\n | 'Cividis'\n | 'Cool'\n | 'CubehelixDefault'\n | 'GnBu'\n | 'Greens'\n | 'Greys'\n | 'Inferno'\n | 'Magma'\n | 'OrRd'\n | 'Oranges'\n | 'Plasma'\n | 'PuBu'\n | 'PuBuGn'\n | 'PuRd'\n | 'Purples'\n | 'RdPu'\n | 'Reds'\n | 'Turbo'\n | 'Viridis'\n | 'Warm'\n | 'YlGn'\n | 'YlGnBu'\n | 'YlOrBr'\n | 'YlOrRd'\n | 'Rainbow'\n | 'Sinebow';\n\nexport type ContinuousDivergingScheme =\n | 'BrBG'\n | 'PRGn'\n | 'PiYG'\n | 'PuOr'\n | 'RdBu'\n | 'RdGy'\n | 'RdYlBu'\n | 'RdYlGn'\n | 'Spectral';\n\nexport type BinnedNumericScheme =\n | 'Blues'\n | 'BuGn'\n | 'BuPu'\n | 'GnBu'\n | 'Greens'\n | 'Greys'\n | 'OrRd'\n | 'Oranges'\n | 'PuBu'\n | 'PuBuGn'\n | 'PuRd'\n | 'Purples'\n | 'RdPu'\n | 'Reds'\n | 'YlGn'\n | 'YlGnBu'\n | 'YlOrBr'\n | 'YlOrRd'\n | 'BrBG'\n | 'PRGn'\n | 'PiYG'\n | 'PuOr'\n | 'RdBu'\n | 'RdGy'\n | 'RdYlBu'\n | 'RdYlGn'\n | 'Spectral';\n\nexport type CategoricalScheme =\n | 'Accent'\n | 'Dark2'\n | 'Paired'\n | 'Pastel1'\n | 'Pastel2'\n | 'Set1'\n | 'Set2'\n | 'Set3'\n | 'Tableau10'\n | 'Observable10'\n | 'Category10';\n\nexport type LayerColorScale =\n | {\n prop?: LayerColorScaleProp;\n field: string;\n type: 'sequential';\n scheme: ContinuousSequentialScheme;\n domain: 'auto' | [number, number];\n clamp?: boolean;\n reverse?: boolean;\n nullColor?: [number, number, number, number?];\n legend?: LayerColorLegendConfig;\n }\n | {\n prop?: LayerColorScaleProp;\n field: string;\n type: 'diverging';\n scheme: ContinuousDivergingScheme;\n domain: 'auto' | [number, number, number];\n clamp?: boolean;\n reverse?: boolean;\n nullColor?: [number, number, number, number?];\n legend?: LayerColorLegendConfig;\n }\n | {\n prop?: LayerColorScaleProp;\n field: string;\n type: 'quantize';\n scheme: BinnedNumericScheme;\n domain: 'auto' | [number, number];\n bins?: number;\n clamp?: boolean;\n reverse?: boolean;\n nullColor?: [number, number, number, number?];\n legend?: LayerColorLegendConfig;\n }\n | {\n prop?: LayerColorScaleProp;\n field: string;\n type: 'quantile';\n scheme: BinnedNumericScheme;\n bins?: number;\n reverse?: boolean;\n nullColor?: [number, number, number, number?];\n legend?: LayerColorLegendConfig;\n }\n | {\n prop?: LayerColorScaleProp;\n field: string;\n type: 'threshold';\n scheme: BinnedNumericScheme;\n thresholds: number[];\n reverse?: boolean;\n nullColor?: [number, number, number, number?];\n legend?: LayerColorLegendConfig;\n }\n | {\n prop?: LayerColorScaleProp;\n field: string;\n type: 'categorical';\n scheme: CategoricalScheme;\n reverse?: boolean;\n unknownColor?: [number, number, number, number?];\n nullColor?: [number, number, number, number?];\n legend?: LayerColorLegendConfig;\n };\n\nexport type LayerExtensionConfig = {\n dataset?: string;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n colorScale?: LayerColorScale;\n};\n\nexport type LayerExtensionProps = {\n _sqlrooms?: LayerExtensionConfig;\n};\n\nexport type DeckMapProps = {\n spec: string | Record<string, unknown>;\n datasets?: Record<string, DeckDatasetInput>;\n sqlQuery?: string;\n arrowTable?: arrow.Table;\n queryResult?: DeckQueryResultLike;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n mapStyle?: string;\n deckProps?: Partial<DeckProps>;\n mapProps?: Partial<MapProps>;\n className?: string;\n children?: ReactNode;\n};\n"]}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/deck",
3
- "version": "0.29.0-rc.2",
3
+ "version": "0.29.0-rc.3",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/index.js",
@@ -21,20 +21,25 @@
21
21
  "access": "public"
22
22
  },
23
23
  "dependencies": {
24
- "@deck.gl/core": "^9.2.11",
25
- "@deck.gl/json": "^9.2.11",
26
- "@deck.gl/layers": "^9.2.11",
27
- "@deck.gl/react": "^9.2.11",
24
+ "@deck.gl/core": "^9.3.1",
25
+ "@deck.gl/json": "^9.3.1",
26
+ "@deck.gl/layers": "^9.3.1",
27
+ "@deck.gl/react": "^9.3.1",
28
28
  "@geoarrow/deck.gl-layers": "0.3.2",
29
29
  "@loaders.gl/core": "^4.4.1",
30
30
  "@loaders.gl/geoarrow": "^4.4.1",
31
31
  "@loaders.gl/gis": "^4.4.1",
32
32
  "@loaders.gl/wkt": "^4.4.1",
33
- "@sqlrooms/color-scales": "workspace:*",
34
- "@sqlrooms/duckdb": "workspace:*",
35
- "@sqlrooms/ui": "workspace:*",
33
+ "@paralleldrive/cuid2": "^3.0.0",
34
+ "@sqlrooms/color-scales": "0.29.0-rc.3",
35
+ "@sqlrooms/duckdb": "0.29.0-rc.3",
36
+ "@sqlrooms/mosaic": "0.29.0-rc.3",
37
+ "@sqlrooms/ui": "0.29.0-rc.3",
38
+ "@uwdata/mosaic-core": "^0.21.0",
39
+ "@uwdata/mosaic-sql": "^0.21.0",
40
+ "lucide-react": "^0.555.0",
36
41
  "maplibre-gl": "^5.12.0",
37
- "react-map-gl": "^8.1.0",
42
+ "react-map-gl": "^8.1.1",
38
43
  "zod": "^4.1.8",
39
44
  "zustand": "^5.0.8"
40
45
  },
@@ -58,5 +63,6 @@
58
63
  "typedoc": "typedoc",
59
64
  "test": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest",
60
65
  "test:watch": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest --watch"
61
- }
66
+ },
67
+ "gitHead": "cfe98c975d09c59aa8b2f2b01e7ef9fd96bc90b0"
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"}
@@ -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
@@ -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"}
@@ -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,3 +0,0 @@
1
- import type { DeckDatasetInput, PreparedDeckDatasetState } from '../types';
2
- export declare function usePreparedDeckDatasets(datasets: Record<string, DeckDatasetInput>): Record<string, PreparedDeckDatasetState>;
3
- //# sourceMappingURL=usePreparedDeckDatasets.d.ts.map
@@ -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"}
@@ -1,61 +0,0 @@
1
- import { useEffect, useState } from 'react';
2
- import { useStoreWithDuckDb } from '@sqlrooms/duckdb';
3
- import { resolveArrowTable } from './normalizeDatasets';
4
- import { prepareDeckDataset } from '../prepare/prepareDeckDataset';
5
- export function usePreparedDeckDatasets(datasets) {
6
- const executeSql = useStoreWithDuckDb((state) => state.db.executeSql);
7
- const [states, setStates] = useState({});
8
- useEffect(() => {
9
- let cancelled = false;
10
- setStates(Object.fromEntries(Object.entries(datasets).map(([datasetId, input]) => [
11
- datasetId,
12
- input.sqlQuery ? { status: 'loading' } : { status: 'loading' },
13
- ])));
14
- for (const [datasetId, input] of Object.entries(datasets)) {
15
- const run = async () => {
16
- try {
17
- let table = resolveArrowTable(input);
18
- if (!table && input.sqlQuery) {
19
- const queryHandle = await executeSql(input.sqlQuery);
20
- if (!queryHandle) {
21
- throw new Error(`Query for dataset "${datasetId}" was cancelled.`);
22
- }
23
- table = await queryHandle;
24
- }
25
- if (!table) {
26
- throw new Error(`Dataset "${datasetId}" could not resolve an Arrow table.`);
27
- }
28
- const prepared = prepareDeckDataset({
29
- datasetId,
30
- table,
31
- geometryColumn: input.geometryColumn,
32
- geometryEncodingHint: input.geometryEncodingHint,
33
- });
34
- if (!cancelled) {
35
- setStates((current) => ({
36
- ...current,
37
- [datasetId]: { status: 'ready', prepared },
38
- }));
39
- }
40
- }
41
- catch (error) {
42
- if (!cancelled) {
43
- setStates((current) => ({
44
- ...current,
45
- [datasetId]: {
46
- status: 'error',
47
- error: error instanceof Error ? error : new Error(String(error)),
48
- },
49
- }));
50
- }
51
- }
52
- };
53
- void run();
54
- }
55
- return () => {
56
- cancelled = true;
57
- };
58
- }, [datasets, executeSql]);
59
- return states;
60
- }
61
- //# sourceMappingURL=usePreparedDeckDatasets.js.map