Repository navigation
feat: expand deck example with Overture buildings - #570
Conversation
📝 WalkthroughWalkthroughThis PR adds WKB→GeoArrow polygon promotion and a dataset-state callback to the deck package, and updates the deckgl example to load a remote Zurich buildings Parquet via httpfs, register it in the store, and render a dual-mode map (buildings with 3D extrusion/height coloring and airports) with enhanced tooltips and README/pnpm updates. ChangesDeck Package Enhancements
Deckgl Example with Dual-Mode Map
Misc small edits
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
a743e2a to
b68240b
Compare
There was a problem hiding this comment.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
packages/deck/src/prepare/wkbDecoder.ts (2)
369-405:⚠️ Potential issue | 🟡 Minor
supportsGeoArrowPromotiononly inspects the first non-null row, which can disagree withtoGeoArrowLike.
getSampleGeometry/getSampleWKBGeomTypereturn as soon as the first non-null row decodes successfully. If that row is aPolygonbut a later row is aMultiPolygon(or aPointrow sneaks into a polygon column), this method returnstrueandtoGeoArrowLikelater throws'GeoArrow promotion failed: unsupported geometry type for column.'at render time. Consider either:
- having
toGeoArrowLikeroute the table to the GeoJSON-binary fallback instead of throwing when promotion fails aftersupportsGeoArrowPromotionreturnedtrue, or- sampling more rows (or all rows lazily during
toGeoArrowLike) before claiming support.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/deck/src/prepare/wkbDecoder.ts` around lines 369 - 405, supportsGeoArrowPromotion is unsafe because getSampleGeometry/getSampleWKBGeomType only look at the first non-null row and can misreport column homogeneity; update supportsGeoArrowPromotion (used in wkbGeometryDecoder) to sample multiple rows instead of relying on a single sample: for the given table and columnName call getSampleGeometry/getSampleWKBGeomType repeatedly (or iterate rows lazily) up to a reasonable cap (e.g., 100 or full table) and return true only if every non-null sampled geometry matches the expected type for POINT_LAYERS (compare to 'Point' or WKB_POINT) or POLYGON_LAYERS (compare to 'Polygon' or WKB_POLYGON); if any mismatch is found return false so toGeoArrowLike will not attempt promotion for mixed types. Ensure you reference supportsGeoArrowPromotion, getSampleGeometry, getSampleWKBGeomType, POINT_LAYERS, POLYGON_LAYERS, WKB_POINT, WKB_POLYGON, and toGeoArrowLike in the change so reviewers can locate the logic.
297-356:⚠️ Potential issue | 🟠 MajorUse
NaNfor null point coordinates to comply with GeoArrow specification.The GeoArrow specification explicitly requires that null points use
POINT (NaN NaN)for child coordinates, not(0, 0). Currently, null/unparseable rows set the validity bitmap but leavexyValues[i*2]andxyValues[i*2+1]at their default0. This violates the specification (which mandates child FixedSizeList values be non-nullable and use NaN for null geometries) and creates phantom coordinates that downstream consumers will read as valid points at Null Island. Update the code to fill null slots withNaNto match the GeoArrow specification and align with implementations like@geoarrow/deck.gl-layersandgeoarrow-rs.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/deck/src/prepare/wkbDecoder.ts` around lines 297 - 356, In tryPromotePointTable update handling of null/unparseable geometries so the child coordinates are set to NaN instead of left as 0: whenever you mark isNull[i]=1 (for raw == null, failed parseGeometryValue, or any branch where you skip writing coordinates) also assign xyValues[i*2]=Number.NaN and xyValues[i*2+1]=Number.NaN; keep the existing nullCount increment and validity bitmap logic, and leave the success paths (WKT Point and WKB Point branches) unchanged—this ensures the FixedSizeList child uses NaN for null points per the GeoArrow spec before building floatData/geomData and returning buildPromotedResult.packages/deck/src/json/layerCompatibility.ts (1)
87-105:⚠️ Potential issue | 🟡 Minor
allowGeoArrowPromotion: trueon Path/Trips layers is unsupported by the decoder.
packages/deck/src/prepare/wkbDecoder.tsonly implements promotion forPOINT_LAYERS(GeoArrowScatterplotLayer,GeoArrowHeatmapLayer,GeoArrowColumnLayer) andPOLYGON_LAYERS(GeoArrowPolygonLayer,GeoArrowSolidPolygonLayer). ForGeoArrowPathLayerandGeoArrowTripsLayer,supportsGeoArrowPromotionfalls through toreturn false, so flagging them asallowGeoArrowPromotion: truehere is misleading — the consumer-visible behavior won't change but readers (and any code that relies on this flag without re-checking the decoder) will believe LineString/MultiLineString promotion is wired up.Either drop the flag on Path/Trips for now to match the decoder, or add
LineStringpromotion (and aLINE_LAYERSset) inwkbDecoder.tstogether with this change.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/deck/src/json/layerCompatibility.ts` around lines 87 - 105, The manifest wrongly sets allowGeoArrowPromotion: true for GeoArrowPathLayer and GeoArrowTripsLayer even though prepare/wkbDecoder.ts only implements promotion for POINT_LAYERS and POLYGON_LAYERS; either remove (or set to false) the allowGeoArrowPromotion flag in the GeoArrowPathLayer and GeoArrowTripsLayer entries (referencing the allowGeoArrowPromotion property and the GeoArrowPathLayer/GeoArrowTripsLayer objects in layerCompatibility.ts) so the config matches supportsGeoArrowPromotion in wkbDecoder.ts, or alternatively implement LineString promotion by adding a LINE_LAYERS set and the corresponding promotion logic in supportsGeoArrowPromotion inside wkbDecoder.ts to support LineString/MultiLineString promotions for Path/Trips layers.
🧹 Nitpick comments (5)
examples/deckgl/src/components/MainView.tsx (1)
7-10: Minor: inconsistent dataset-name handling.
buildingsis referenced via the exportedBUILDINGS_TABLE_NAMEconstant butairportsis still a magic string. Since both names also appear instore.ts(tableName: 'airports'), promoting'airports'toAIRPORTS_TABLE_NAMEindataSources.tswould keep table-name truth in one place and prevent silent drift between the store andMainView/MapView.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@examples/deckgl/src/components/MainView.tsx` around lines 7 - 10, Promote the magic string 'airports' to a shared constant (e.g., AIRPORTS_TABLE_NAME) in the same module that exports BUILDINGS_TABLE_NAME (dataSources.ts) and replace the literal in MainView's useRoomStore selector (currently using s.db.findTableByName('airports')) with that constant; also update any other usages (e.g., MapView and store.ts where tableName: 'airports' is set) to reference AIRPORTS_TABLE_NAME so the table name is defined in one place and cannot drift.packages/deck/src/DeckJsonMap.tsx (1)
107-124:loadingDatasetsis now dead code.Since the early-return condition on Line 122 only checks
!failedDatasets.length, theloadingDatasetsarray computed on Lines 110–112 is no longer read by anything. Either drop the computation, or surface loading state in the overlay alongside the error state — silently keeping a never-used aggregation makes future readers wonder if a render path is missing.♻️ Drop the unused computation
- const loadingDatasets = Object.entries(datasetStates) - .filter(([, state]) => state.status === 'loading') - .map(([datasetId]) => datasetId); const failedDatasets = Object.entries(datasetStates).filter(🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/deck/src/DeckJsonMap.tsx` around lines 107 - 124, The computed but unused loadingDatasets in renderDatasetStatusOverlay is dead code; remove the loadingDatasets aggregation (the Object.entries(...).filter(...).map(...) block) to eliminate the unused variable, or if you intended to show loading state, instead reference loadingDatasets when rendering the overlay alongside failedDatasets; update renderDatasetStatusOverlay (and any JSX it returns) to either drop loadingDatasets entirely or include it in the returned overlay so the variable is actually consumed. Ensure references are to renderDatasetStatusOverlay, loadingDatasets, failedDatasets, and PreparedDeckDatasetState.examples/deckgl/src/store.ts (1)
22-22: Nit: missing trailing semicolon ininitializationQuery.
'LOAD httpfs; LOAD spatial'works in DuckDB but the rest of SQLRooms initialization queries terminate the final statement consistently; it also avoids surprises if anything later concatenates onto this string.- initializationQuery: 'LOAD httpfs; LOAD spatial', + initializationQuery: 'LOAD httpfs; LOAD spatial;',🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@examples/deckgl/src/store.ts` at line 22, The initializationQuery string is missing a trailing semicolon; update the initializationQuery value (symbol name: initializationQuery in the store module) to terminate the final statement with a semicolon (e.g., 'LOAD httpfs; LOAD spatial;') so it matches other SQLRooms initialization queries and avoids issues if the string is later concatenated.packages/deck/src/prepare/wkbDecoder.ts (1)
85-97: Minor:(bitmap[i >> 3] ?? 0)is unnecessary.
new Uint8Array(...)returns zero-initialized bytes and indexed reads onUint8Arrayalways return anumber, neverundefined, so the nullish coalescing is dead code that exists only to satisfynoUncheckedIndexedAccess. A type assertion or non-null assertion is more honest and avoids the runtime branch in a hot loop:♻️ Suggestion
- if (isNull[i] !== 1) - bitmap[i >> 3] = (bitmap[i >> 3] ?? 0) | (1 << (i & 7)); + if (isNull[i] !== 1) + bitmap[i >> 3]! |= 1 << (i & 7);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/deck/src/prepare/wkbDecoder.ts` around lines 85 - 97, In buildNullBitmap, the expression "(bitmap[i >> 3] ?? 0)" is unnecessary and causes an extra runtime branch; replace it with a non-null assertion or direct in-place OR to avoid the nullish coalescing. Locate function buildNullBitmap and change the write to the bitmap bucket (indexed by i >> 3) to use a non-null assertion (e.g., bitmap[i >> 3]!) or perform an in-place OR on that index so the code becomes "bitmap[index] = bitmap[index] | (1 << (i & 7))" (or equivalently "bitmap[index] |= ..."), which satisfies noUncheckedIndexedAccess without the dead branch.examples/deckgl/src/components/MapView.tsx (1)
79-79: Hardcoded color-scale domain is tied to a specific dataset snapshot.
domain: [0.003950834274291992, 186.7]is the min/max of the currentzurich_buildings.parquet. The README also states the legend "domain matching loaded data min/max". If the dataset is regenerated (the README documents how) these values silently desync from reality, breaking the legend semantics.Consider deriving the domain from
buildingState.prepared.tableonce it'sready(e.g., a SQLMIN/MAX(height)probe or computed from the loaded Arrow column) and feeding it intoBUILDINGS_LAYERSviauseMemo, falling back to a sensible default while loading.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@examples/deckgl/src/components/MapView.tsx` at line 79, The hardcoded color-scale domain in BUILDINGS_LAYERS should be replaced with a dynamic value computed from buildingState.prepared.table when it is ready: compute the min/max height (either via a SQL MIN/MAX probe against buildingState.prepared.table or by reading the Arrow column and computing min/max) and pass that [min,max] into BUILDINGS_LAYERS using useMemo so the layer updates when data changes; while buildingState.prepared.table is not ready, fall back to a sensible default domain to avoid breaking the legend semantics.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@examples/deckgl/README.md`:
- Line 13: Update the README to avoid a brittle hardcoded count and to correct
the tooltip claim: change the phrasing in examples/deckgl/README.md (the
sentence referencing "It renders 48,451 ... building footprints") to a resilient
form such as "~48k building footprints (Zurich buildings dataset, currently
48,451 rows)" and either remove "name" from the tooltip description or add
support for it in the code; if you choose the latter, modify the BUILDINGS_QUERY
projection in MapView.tsx (the BUILDINGS_QUERY constant) to include the name
field and update the tooltip handler in the MapView component to render name
along with class and height so the README matches the implementation.
In `@examples/deckgl/src/components/MapView.tsx`:
- Around line 30-36: The BUILDINGS_QUERY in MapView.tsx currently selects only
class, height, and geometry, but the README and tooltip expect a building name;
update the BUILDINGS_QUERY to include the name field (e.g., names.primary AS
name) and update the tooltip handler that reads row.class and row.height to also
read and render row.name so the tooltip shows name, class, and height
consistently (or, if you prefer to remove name support, update README
instead—prefer adding the name to BUILDINGS_QUERY and the tooltip).
- Around line 217-219: The current airportsStatus assignment (airportsStatus =
majorAirportsState ?? airportsState) can hide an airportsState error when
majorAirportsState is defined; change the logic to pick the "worst" status
between airportsState and majorAirportsState (e.g., error > loading > ready) so
any error or loading on the primary airports layer is surfaced; implement this
by adding a small helper or inline comparator that examines airportsState.status
and majorAirportsState.status and returns the state with the highest-priority
(worst) status, then assign airportsStatus using that helper instead of the
nullish-coalescing expression.
- Around line 216-228: The hardcoded fallback 48451 in buildingCount is brittle
and asymmetric with airportCount; change buildingCount so it follows the same
pattern as airportCount (i.e., return null unless buildingState?.status ===
'ready') by removing the magic number and using the prepared.table.numRows only
when buildingState.status === 'ready' (referencing datasetStates, buildingState,
buildingCount, and airportCount) and ensure the UI that consumes buildingCount
handles null the same way it does for airportCount.
In `@examples/deckgl/src/index.css`:
- Around line 1-8: The `@keyframes` shimmer rule is placed between `@import`
statements which violates CSS ordering and the shimmer animation appears unused;
fix by moving or removing it: ensure both `@import` 'tailwindcss' and `@import`
'@sqlrooms/ui/tailwind-preset.css' appear first, then either delete the
`@keyframes` shimmer block if not used anywhere or relocate the `@keyframes` shimmer
definition after all `@import` directives (and update any component using
"shimmer" if you keep it).
In `@packages/deck/src/DeckJsonMap.tsx`:
- Around line 210-213: The effect depends on onDatasetStatesChange identity and
can trigger render loops for callers passing unstable inline callbacks; update
DeckJsonMap to avoid this by capturing the latest callback in a ref (e.g.,
create cbRef for onDatasetStatesChange, keep it updated in an effect, and invoke
cbRef.current(datasetStates) in the datasetStates-only effect) or alternatively
add README docs requiring consumers to pass a stable callback via useCallback;
reference the onDatasetStatesChange prop, the existing useEffect that currently
depends on [datasetStates, onDatasetStatesChange], and the datasetStates value
from usePreparedDatasetStates when making the change.
In `@packages/deck/src/prepare/wkbDecoder.ts`:
- Around line 49-72: parseWKBHeader currently misses ISO ZM (3000–3007)
geometries causing wrong hasZ/hasM, base and coordBytes; update parseWKBHeader
to detect the 3000–3007 ISO range (set both hasZ and hasM true) and normalize
base by subtracting 3000 for that range before the existing 2000/1000
adjustments, and ensure the EWKB bit checks for hasZ/hasM still apply (i.e.,
hasZ = EWKB Z bit || ISO 1000 range || ISO 3000 range; hasM = EWKB M bit || ISO
2000 range || ISO 3000 range) so coordBytes and geomType (base) are computed
correctly.
- Around line 184-290: tryPromotePolygonTable currently only accepts WKB_POLYGON
/ 'Polygon' and will blow up on MultiPolygon rows; update tryPromotePolygonTable
to also handle WKB_MULTIPOLYGON and geom.type === 'MultiPolygon' by iterating
each polygon in the MultiPolygon and pushing each polygon's rings into
ringOffsetsList (and still increment polygonOffsets[i] once per original row) so
rings from all constituent polygons are flattened into the same row's ring list;
also add the same WKB_MULTIPOLYGON branch when reading from the binary hdr
(check geomType === WKB_MULTIPOLYGON and parse nested polygon counts/offsets
accordingly). As a complementary safety change, ensure the promotion path is
tolerant by making toGeoArrowLike (or getGeoArrowLayerData) return null on any
unsupported geometry type instead of throwing, or broaden
supportsGeoArrowPromotion / getSampleWKBGeomType / getSampleGeometry to scan
multiple non-null rows when deciding compatibility so mixed Polygon/MultiPolygon
columns are detected earlier and fall back to GeoJSON-binary.
---
Outside diff comments:
In `@packages/deck/src/json/layerCompatibility.ts`:
- Around line 87-105: The manifest wrongly sets allowGeoArrowPromotion: true for
GeoArrowPathLayer and GeoArrowTripsLayer even though prepare/wkbDecoder.ts only
implements promotion for POINT_LAYERS and POLYGON_LAYERS; either remove (or set
to false) the allowGeoArrowPromotion flag in the GeoArrowPathLayer and
GeoArrowTripsLayer entries (referencing the allowGeoArrowPromotion property and
the GeoArrowPathLayer/GeoArrowTripsLayer objects in layerCompatibility.ts) so
the config matches supportsGeoArrowPromotion in wkbDecoder.ts, or alternatively
implement LineString promotion by adding a LINE_LAYERS set and the corresponding
promotion logic in supportsGeoArrowPromotion inside wkbDecoder.ts to support
LineString/MultiLineString promotions for Path/Trips layers.
In `@packages/deck/src/prepare/wkbDecoder.ts`:
- Around line 369-405: supportsGeoArrowPromotion is unsafe because
getSampleGeometry/getSampleWKBGeomType only look at the first non-null row and
can misreport column homogeneity; update supportsGeoArrowPromotion (used in
wkbGeometryDecoder) to sample multiple rows instead of relying on a single
sample: for the given table and columnName call
getSampleGeometry/getSampleWKBGeomType repeatedly (or iterate rows lazily) up to
a reasonable cap (e.g., 100 or full table) and return true only if every
non-null sampled geometry matches the expected type for POINT_LAYERS (compare to
'Point' or WKB_POINT) or POLYGON_LAYERS (compare to 'Polygon' or WKB_POLYGON);
if any mismatch is found return false so toGeoArrowLike will not attempt
promotion for mixed types. Ensure you reference supportsGeoArrowPromotion,
getSampleGeometry, getSampleWKBGeomType, POINT_LAYERS, POLYGON_LAYERS,
WKB_POINT, WKB_POLYGON, and toGeoArrowLike in the change so reviewers can locate
the logic.
- Around line 297-356: In tryPromotePointTable update handling of
null/unparseable geometries so the child coordinates are set to NaN instead of
left as 0: whenever you mark isNull[i]=1 (for raw == null, failed
parseGeometryValue, or any branch where you skip writing coordinates) also
assign xyValues[i*2]=Number.NaN and xyValues[i*2+1]=Number.NaN; keep the
existing nullCount increment and validity bitmap logic, and leave the success
paths (WKT Point and WKB Point branches) unchanged—this ensures the
FixedSizeList child uses NaN for null points per the GeoArrow spec before
building floatData/geomData and returning buildPromotedResult.
---
Nitpick comments:
In `@examples/deckgl/src/components/MainView.tsx`:
- Around line 7-10: Promote the magic string 'airports' to a shared constant
(e.g., AIRPORTS_TABLE_NAME) in the same module that exports BUILDINGS_TABLE_NAME
(dataSources.ts) and replace the literal in MainView's useRoomStore selector
(currently using s.db.findTableByName('airports')) with that constant; also
update any other usages (e.g., MapView and store.ts where tableName: 'airports'
is set) to reference AIRPORTS_TABLE_NAME so the table name is defined in one
place and cannot drift.
In `@examples/deckgl/src/components/MapView.tsx`:
- Line 79: The hardcoded color-scale domain in BUILDINGS_LAYERS should be
replaced with a dynamic value computed from buildingState.prepared.table when it
is ready: compute the min/max height (either via a SQL MIN/MAX probe against
buildingState.prepared.table or by reading the Arrow column and computing
min/max) and pass that [min,max] into BUILDINGS_LAYERS using useMemo so the
layer updates when data changes; while buildingState.prepared.table is not
ready, fall back to a sensible default domain to avoid breaking the legend
semantics.
In `@examples/deckgl/src/store.ts`:
- Line 22: The initializationQuery string is missing a trailing semicolon;
update the initializationQuery value (symbol name: initializationQuery in the
store module) to terminate the final statement with a semicolon (e.g., 'LOAD
httpfs; LOAD spatial;') so it matches other SQLRooms initialization queries and
avoids issues if the string is later concatenated.
In `@packages/deck/src/DeckJsonMap.tsx`:
- Around line 107-124: The computed but unused loadingDatasets in
renderDatasetStatusOverlay is dead code; remove the loadingDatasets aggregation
(the Object.entries(...).filter(...).map(...) block) to eliminate the unused
variable, or if you intended to show loading state, instead reference
loadingDatasets when rendering the overlay alongside failedDatasets; update
renderDatasetStatusOverlay (and any JSX it returns) to either drop
loadingDatasets entirely or include it in the returned overlay so the variable
is actually consumed. Ensure references are to renderDatasetStatusOverlay,
loadingDatasets, failedDatasets, and PreparedDeckDatasetState.
In `@packages/deck/src/prepare/wkbDecoder.ts`:
- Around line 85-97: In buildNullBitmap, the expression "(bitmap[i >> 3] ?? 0)"
is unnecessary and causes an extra runtime branch; replace it with a non-null
assertion or direct in-place OR to avoid the nullish coalescing. Locate function
buildNullBitmap and change the write to the bitmap bucket (indexed by i >> 3) to
use a non-null assertion (e.g., bitmap[i >> 3]!) or perform an in-place OR on
that index so the code becomes "bitmap[index] = bitmap[index] | (1 << (i & 7))"
(or equivalently "bitmap[index] |= ..."), which satisfies
noUncheckedIndexedAccess without the dead branch.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 8b90e1c4-1c2b-4115-9a73-c3b45f6ee0c6
📒 Files selected for processing (12)
examples/deckgl/README.mdexamples/deckgl/src/components/MainView.tsxexamples/deckgl/src/components/MapView.tsxexamples/deckgl/src/dataSources.tsexamples/deckgl/src/index.cssexamples/deckgl/src/room.tsxexamples/deckgl/src/store.tspackages/deck/README.mdpackages/deck/src/DeckJsonMap.tsxpackages/deck/src/json/layerCompatibility.tspackages/deck/src/prepare/wkbDecoder.tspackages/deck/src/types.ts
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@examples/deckgl/src/components/MapView.tsx`:
- Around line 88-122: The AIRPORT_LAYERS definition currently hardcodes the
dataset key as the string 'airports' in the _sqlroomsBinding for the first
layer; change that binding to use the imported AIRPORTS_TABLE_NAME constant
instead so it always matches the dataset key used when registering datasets.
Locate the AIRPORT_LAYERS constant and update the first layer's _sqlroomsBinding
from {dataset: 'airports'} to reference AIRPORTS_TABLE_NAME (the
already-imported symbol) so the layer binding remains correct if the table name
changes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: f2bef39a-faf9-4445-9691-49913e10ce7b
📒 Files selected for processing (6)
examples/deckgl/README.mdexamples/deckgl/src/components/MainView.tsxexamples/deckgl/src/components/MapView.tsxexamples/deckgl/src/dataSources.tsexamples/deckgl/src/index.cssexamples/deckgl/src/store.ts
💤 Files with no reviewable changes (1)
- examples/deckgl/src/index.css
✅ Files skipped from review due to trivial changes (2)
- examples/deckgl/src/store.ts
- examples/deckgl/README.md
🚧 Files skipped from review as they are similar to previous changes (1)
- examples/deckgl/src/components/MainView.tsx
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
examples/deckgl/package.json (1)
33-33:⚠️ Potential issue | 🟠 Major | ⚡ Quick winUpgrade
eslint-plugin-react-hookstov6+for React 19.2 compatibility.
examples/deckgl/package.jsonusesreact/react-dom^19.2.0but pinseslint-plugin-react-hooksto^5.2.0; React 19.2 requires upgrading the plugin (v6+—ideally^6.1.1+) so ESLint enforces the updated hook semantics.
Bumpeslint-plugin-react-hooksto^6.1.1or the current latest^7.1.1.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@examples/deckgl/package.json` at line 33, The package.json pins eslint-plugin-react-hooks to ^5.2.0 which is incompatible with React 19.2; update the dependency entry "eslint-plugin-react-hooks" to a v6+ release (e.g., ^6.1.1 or ^7.1.1) so ESLint uses the updated hook semantics required by React 19.2, then run install to update lockfiles.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@examples/deckgl/package.json`:
- Line 33: The package.json pins eslint-plugin-react-hooks to ^5.2.0 which is
incompatible with React 19.2; update the dependency entry
"eslint-plugin-react-hooks" to a v6+ release (e.g., ^6.1.1 or ^7.1.1) so ESLint
uses the updated hook semantics required by React 19.2, then run install to
update lockfiles.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 94c87a94-16e8-42cd-9476-af90d1f4e287
📒 Files selected for processing (7)
apps/sqlrooms-cli-ui/src/components/AssistantChatContainer.tsxexamples/deckgl/package.jsonexamples/deckgl/src/components/MapView.tsxpackages/ai-core/src/components/AnalysisResultsContainer.tsxpackages/deck/src/DeckJsonMap.tsxpackages/mosaic/__tests__/dashboard-ai.test.tspackages/mosaic/src/MosaicSlice.ts
💤 Files with no reviewable changes (2)
- packages/mosaic/tests/dashboard-ai.test.ts
- packages/mosaic/src/MosaicSlice.ts
✅ Files skipped from review due to trivial changes (2)
- packages/ai-core/src/components/AnalysisResultsContainer.tsx
- apps/sqlrooms-cli-ui/src/components/AssistantChatContainer.tsx
Closes #560
deck-arrow.mp4
Summary by CodeRabbit
New Features
Documentation