Skip to content

chore: deck.gl 9.2 upgrade & loaders.gl, luma.gl upgrades#3271

Open
igorDykhta wants to merge 19 commits intomasterfrom
igr/deckgl-9-2
Open

chore: deck.gl 9.2 upgrade & loaders.gl, luma.gl upgrades#3271
igorDykhta wants to merge 19 commits intomasterfrom
igr/deckgl-9-2

Conversation

@igorDykhta
Copy link
Collaborator

@igorDykhta igorDykhta commented Dec 25, 2025

  • deck.gl 8.9.27 → 9.2.11

  • luma.gl 8.5.x → 9.2.6

  • loaders.gl 4.3.2 → 4.3.4,

  • nebula.gl → @deck.gl-community/editable-layers 9.2.8

  • app starts, as expected, no new console errors

  • point layer

  • arc layer

  • line layer

  • geojson layer

  • icon layer

  • grid layer

  • hexagon layer

  • cluster

  • heatmap

  • h3

  • s2

  • trip layer

  • 3d mesh

  • 3d buildings

  • internal column layer

  • vector tile layer

  • WMS layer

  • Polygon / Draw on Map

  • Tooltips & Interactions

  • Geocoder

  • 2d / perspective / split map

  • Export data

  • Export image

  • Filters

  • Geoarrow layers

  • Postprocessing effects

  • Light & Shadow

  • raster tile - bitmap pmtiles

  • raster tile - stac collections

@igorDykhta igorDykhta changed the title chore: WIP upgrades chore: deck.gl 9.2 upgrade & loaders.gl, luma.gl upgrades Dec 25, 2025
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
@igorDykhta igorDykhta marked this pull request as ready for review March 26, 2026 16:03
Copilot AI review requested due to automatic review settings March 26, 2026 16:03
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Upgrades kepler.gl’s rendering stack to deck.gl 9.2 (plus luma.gl/loaders.gl/mjolnir updates) and adapts kepler’s custom layers/effects/tooling to the new APIs (device init, parameter-based blending, shader/module pipeline changes, editable layers replacement).

Changes:

  • Bump deck.gl to 9.2.x across packages, replace nebula.gl with @deck.gl-community/editable-layers, and update loaders.gl/luma.gl/math.gl.
  • Update kepler layers/effects/utilities to deck.gl 9 patterns (device initialization, parameters blending, updated shader/module plumbing for raster & postprocessing).
  • Adjust typings/TS config (TypeScript 5.6, moduleResolution: "bundler", local type augmentations) and test/tooling transpilation for ESM deps.

Reviewed changes

Copilot reviewed 97 out of 110 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
website/src/components/policy.js Formatting-only website copy change.
website/src/components/header.js JSX formatting tweak.
website/src/components/footer.js JSX formatting for footer legal text.
tsconfig.json Switch TS module resolution to bundler.
test/node/utils/export-utils-test.js Formatting-only test change.
test/node/utils/editor-utils-test.js Switch EditableGeoJsonLayer import to deck.gl-community package.
src/utils/src/index.ts Export new GL helpers (blending parameters + renderer patch).
src/utils/src/gl-utils.ts Replace GL-constant blending with deck.gl 9 parameters + DeckRenderer patch hook.
src/utils/src/export-utils.ts Formatting-only export alignment.
src/utils/src/effect-utils.ts Keep lighting effect module loaded; disable/enable shadow behavior safely for deck.gl 9.
src/utils/src/data-scale-utils.ts Add @ts-nocheck to bypass TS errors.
src/utils/src/data-container-utils.ts Formatting-only object literal expansion.
src/utils/package.json Upgrade deck.gl/luma/loaders versions for utils package.
src/types/reducers.d.ts Replace deck.gl MapViewState import with local type alias.
src/table/package.json Upgrade loaders.gl deps.
src/schemas/package.json Upgrade loaders.gl deps.
src/reducers/src/vis-state-updaters.ts Preserve isVisible during initial layer config setup.
src/reducers/src/vis-state-selectors.ts Add minimal typing on selector input state.
src/reducers/src/layer-utils.ts Move off @deck.gl/core/typed; loosen Deck layer prop typing.
src/reducers/package.json Upgrade loader-utils and math.gl/web-mercator.
src/processors/src/typedefs/deckgl.d.ts Remove legacy deckgl-typings bridge.
src/processors/src/data-processor.ts Switch editable Feature import to deck.gl-community package.
src/processors/package.json Remove deckgl-typings/nebula deps; upgrade loaders; add editable-layers.
src/layers/src/vector-tile/vector-tile-layer.ts Update deck.gl imports; adjust culling parameter for v9; add @ts-nocheck.
src/layers/src/vector-tile/mvt-layer.ts Update deck.gl imports; add @ts-nocheck.
src/layers/src/typedefs/deckgl.d.ts Remove legacy deckgl-typings bridge.
src/layers/src/trip-layer/trip-utils.ts Remove ts-expect-error (typing change).
src/layers/src/trip-layer/trip-layer.ts Formatting-only changes around column detection/props object.
src/layers/src/raster-tile/types.ts Update Tile header + texture prop types for v9; add @ts-nocheck.
src/layers/src/raster-tile/raster-tile-utils.ts Import TypedArray from public loader-utils entrypoint.
src/layers/src/raster-tile/raster-tile-layer.ts Deck v9 imports + redraw scheduling hook; add onRedrawNeeded plumbing; add @ts-nocheck.
src/layers/src/raster-tile/gpu-utils.ts Update luma constants/types; add @ts-nocheck.
src/layers/src/line-layer/line-layer.ts Adjust default layer props typing; remove explicit isVisible: false.
src/layers/src/icon-layer/icon-layer.ts Update culling to cullMode; add @ts-nocheck.
src/layers/src/hexagon-layer/hexagon-utils.ts Support fallback coordinate input; more robust position handling.
src/layers/src/hexagon-layer/hexagon-layer.ts Use cellOutline from picking info instead of recomputing geometry.
src/layers/src/grid-layer/grid-utils.ts Support fallback coordinate (deck.gl 9 picking changes).
src/layers/src/grid-layer/grid-layer.ts Use cellOutline from picking info instead of recomputing geometry.
src/layers/src/editor-layer/modify-mode-extended.ts Switch edit-modes imports to deck.gl-community editable-layers.
src/layers/src/editor-layer/editor-layer.ts Replace nebula EditableGeoJsonLayer/edit-modes with deck.gl-community; add @ts-nocheck.
src/layers/src/editor-layer/editor-layer-utils.ts Use PickingInfo type from @deck.gl/core; improve tooltip math nullish handling.
src/layers/src/cluster-layer/cluster-layer.ts Add ts-expect-error for untyped composite layer usage.
src/layers/src/base-layer.ts Update DataFilterExtension typing suppression comment for deck.gl 9 option.
src/layers/src/aggregation-layer.ts Update aggregation semantics for deck.gl 9 + per-bin filtering wrapper.
src/layers/package.json Upgrade deck.gl/loaders/luma; replace nebula with editable-layers.
src/effects/src/post-processing-effect.ts Switch luma effects import path; use module propTypes for defaults.
src/effects/src/custom-deck-lighting-effect.ts Rework lighting/shadow module patching for luma/deck 9 device pipeline.
src/effects/package.json Upgrade deck.gl/luma deps; add luma effects/engine.
src/duckdb/src/table/index.ts Remove stray trailing whitespace line.
src/duckdb/src/table/duckdb-table-utils.ts Formatting-only query string change.
src/deckgl-layers/src/wms/wms-layer.ts Update deck.gl imports; add @ts-nocheck.
src/deckgl-layers/src/typedefs/deckgl.d.ts Remove legacy deckgl-typings bridge.
src/deckgl-layers/src/svg-icon-layer/svg-icon-layer.ts Update CompositeLayer props typing + generics; add @ts-nocheck.
src/deckgl-layers/src/svg-icon-layer/scatterplot-icon-layer.ts Switch to luma engine Geometry + geometry override strategy.
src/deckgl-layers/src/raster/webgl/types.ts Remove luma webgl Texture2D import; loosen type.
src/deckgl-layers/src/raster/webgl/texture/rgba-image.ts Remove luma webgl Texture2D import; loosen type.
src/deckgl-layers/src/raster/webgl/texture/mask.ts Remove luma webgl Texture2D import; loosen type.
src/deckgl-layers/src/raster/webgl/texture/combine-bands.ts Remove luma webgl Texture2D import; loosen type.
src/deckgl-layers/src/raster/webgl/pansharpen/pansharpen-brovey.ts Remove luma webgl Texture2D import; loosen type.
src/deckgl-layers/src/raster/webgl/color/colormap.ts Remove luma webgl Texture2D import; loosen type.
src/deckgl-layers/src/raster/types.ts Loosen luma webgl texture types to any.
src/deckgl-layers/src/raster/raster-mesh-layer/raster-mesh-layer.ts Port raster mesh layer to luma 9 pipeline/model/bindings; add redraw scheduling.
src/deckgl-layers/src/raster/raster-mesh-layer/raster-mesh-layer-shaders.ts New shader builders for raster mesh layer (GLSL300).
src/deckgl-layers/src/raster/raster-mesh-layer/matrix.ts Update deck.gl imports; loosen CoordinateSystem typing.
src/deckgl-layers/src/raster/raster-layer/raster-layer.ts Port raster bitmap pipeline to luma 9 shader inputs/bindings; add redraw scheduling.
src/deckgl-layers/src/raster/raster-layer/raster-layer-shaders.ts New shader builders + hook registration + module adapter for luma 9.
src/deckgl-layers/src/raster/images.ts Rework texture creation and sampler params for luma 9 device API.
src/deckgl-layers/src/line-layer/line-layer.ts Port enhanced line attributes to deck.gl 9 attribute API; adjust shader edits.
src/deckgl-layers/src/layer-utils/cpu-aggregator.ts Inline BinSorter/aggregation ops compat to adapt to deck.gl 9 changes.
src/deckgl-layers/src/hexagon-layer/enhanced-hexagon-layer.ts Use native CPU aggregation; add cellOutline in picking info.
src/deckgl-layers/src/grid-layer/enhanced-cpu-grid-layer.ts Use native CPU aggregation; add cellOutline in picking info.
src/deckgl-layers/src/deckgl-extensions/filter-shader-module.ts Update injected shader attributes for deck.gl 9 GLSL.
src/deckgl-layers/src/deckgl-extensions/filter-arrow-layer.ts Update attribute manager config for deck.gl 9 stepMode/type strings.
src/deckgl-layers/src/column-layer/enhanced-column-layer.ts Remove custom draw override; update shader injection for v9 uniforms; add @ts-nocheck.
src/deckgl-layers/src/cluster-layer/cluster-layer.ts Shift to CompositeLayer base; adjust cpuAggregator update wiring; add @ts-nocheck.
src/deckgl-layers/src/3d-building-layer/3d-building-layer.ts Update blending parameters to deck.gl 9 parameters strings; add @ts-nocheck.
src/deckgl-layers/package.json Upgrade deck.gl/aggregation-layers + loaders/luma; add luma engine.
src/deckgl-augmentations.d.ts New type augmentations for deck.gl 9 + geo-layers + luma core.
src/deckgl-arrow-layers/src/utils/validate.ts Use @deck.gl/core import path (no /typed).
src/deckgl-arrow-layers/src/utils/utils.ts Use @deck.gl/core import path (no /typed).
src/deckgl-arrow-layers/src/utils/picking.ts Use @deck.gl/core import path (no /typed).
src/deckgl-arrow-layers/src/types.ts Use @deck.gl/core import path (no /typed).
src/deckgl-arrow-layers/src/layers/geo-arrow-text-layer.ts Update deck.gl imports (no /typed); add @ts-nocheck.
src/deckgl-arrow-layers/src/layers/geo-arrow-scatterplot-layer.ts Update deck.gl imports (no /typed); add @ts-nocheck.
src/deckgl-arrow-layers/src/layers/geo-arrow-arc-layer.ts Update deck.gl imports (no /typed); add @ts-nocheck.
src/deckgl-arrow-layers/package.json Update peer deps to deck.gl 9.2.x.
src/constants/src/default-settings.ts Formatting-only trailing brace alignment.
src/components/src/plot-container.tsx Replace glOptions with deck.gl 9 deviceProps.webgl for export.
src/components/src/modals/export-image-modal.tsx Formatting-only JSX change.
src/components/src/map-view-state-context.tsx Replace MapViewState import with local type alias.
src/components/src/map-container.tsx Migrate to onDeviceInitialized, parameters blending, new picking types, and apply postprocessing patch.
src/components/src/geocoder-panel.tsx Switch FlyToInterpolator import; replace MapViewState import with local type alias.
src/components/src/effects/effect-configurator.tsx Use module propTypes instead of uniforms for UI controls.
src/components/src/editor/feature-action-panel.tsx Switch Feature import to deck.gl-community editable-layers.
src/components/src/editor/editor.tsx Switch Feature typing to deck.gl-community editable-layers.
src/components/src/common/icons/close.tsx Formatting-only SVG JSX change.
src/components/src/common/data-table/index.tsx Minor formatting fix in scroll callback.
src/components/package.json Upgrade deck.gl/react/widgets + mjolnir; loaders; add editable-layers.
src/ai-assistant/src/config/models.ts Replace double-quoted keys with standard object syntax + single quotes.
src/ai-assistant/src/components/ai-assistant-component.tsx Formatting-only hook call cleanup.
src/actions/src/vis-state-actions.ts Update picking type imports to PickingInfo.
src/actions/package.json Upgrade deck.gl core dependency.
package.json Upgrade deck.gl mapbox/test-utils, loaders, luma test-utils; bump TS to 5.6; update resolutions; add math.gl.
jest.config.js Expand transform ignore allowlist for ESM deps (deck/luma/preact/etc.).
examples/replace-component/esbuild.config.mjs Remove /typed aliasing for deck.gl modules.
examples/get-started-vite/package.json Upgrade deck.gl/loaders/luma deps; math.gl/web-mercator bump.
examples/demo-app/package.json Upgrade loaders + deck/luma resolutions.
examples/demo-app/esbuild.config.mjs Remove /typed aliasing for deck.gl modules.
bindings/kepler.gl-jupyter/js/package.json Upgrade loaders and deck.gl resolutions for Jupyter binding.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +82 to +87
const proto = DeckRenderer.prototype as any;

setParameters(gl, {
[GL.BLEND]: true,
...(blendFunc
? {
blendFunc: blendFunc.map(getGlConst),
blendEquation: Array.isArray(blendEquation)
? blendEquation.map(getGlConst)
: getGlConst(blendEquation)
}
: {})
});
proto._resizeRenderBuffers = function _resizeRenderBufferPatched() {
const {renderBuffers} = this;
const size = this.device.canvasContext!.getDrawingBufferSize();
const [width, height] = size;
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

patchDeckRendererForPostProcessing overwrites a private DeckRenderer.prototype._resizeRenderBuffers method without checking that it exists, and assumes this.device.canvasContext is always present (!). This can throw at runtime (e.g., non-canvas contexts / future deck.gl changes) and permanently clobbers the original implementation.

Consider guarding on typeof proto._resizeRenderBuffers === 'function' and this.device.canvasContext, and wrapping/calling through to the original implementation when available so future deck.gl updates don’t silently break rendering.

Copilot uses AI. Check for mistakes.
Comment on lines +98 to +99
patchDeckRendererForPostProcessing();

Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Calling patchDeckRendererForPostProcessing() at module import time introduces a global side effect for any consumer that imports map-container (including SSR/tests), and makes it hard to scope/disable the patch.

Prefer applying this patch as late as possible (e.g., inside onDeviceInitialized / deck init) and behind a feature flag, so environments that don’t use postprocessing (or don’t have the relevant renderer internals) don’t get affected.

Suggested change
patchDeckRendererForPostProcessing();
const appConfig = typeof getApplicationConfig === 'function' ? getApplicationConfig() : undefined;
const enableDeckPostProcessingPatch =
!appConfig ||
!appConfig.postProcessing ||
appConfig.postProcessing.enableDeckPostProcessingPatch !== false;
if (typeof window !== 'undefined' && enableDeckPostProcessingPatch) {
patchDeckRendererForPostProcessing();
}

Copilot uses AI. Check for mistakes.
Comment on lines +48 to +63
_patchValidateProgram(): void {
const gl = this.context.device?.gl;
if (gl && !gl.__validateProgramPatched) {
gl.__validateProgramPatched = true;
const origGetProgramParameter = gl.getProgramParameter.bind(gl);
gl.validateProgram = function () {
// no op
};
gl.getProgramParameter = function (program: WebGLProgram, pname: number) {
if (pname === 0x8b83) {
// GL_VALIDATE_STATUS — always return true since we skip validation
return true;
}
return origGetProgramParameter(program, pname);
};
}
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

_patchValidateProgram permanently monkey-patches the WebGL context (gl.validateProgram and gl.getProgramParameter) for all programs, not just this layer. This can mask real validation issues in other layers and makes debugging GL problems much harder.

If this workaround is still required, consider scoping it more narrowly (e.g., behind a config flag, patching only once from a central place with clear opt-in, and/or restoring the original functions on finalize) to avoid global behavioral changes.

Copilot uses AI. Check for mistakes.
Comment on lines 241 to 264
@@ -260,8 +260,7 @@ export default class LineLayer extends ArcLayer {
geoarrow0: {...defaultAltColumn},
geoarrow1: {...defaultAltColumn}
},
label: `${fieldPairs[0].defaultName} -> ${fieldPairs[1].defaultName} line`,
isVisible: false
label: `${fieldPairs[0].defaultName} -> ${fieldPairs[1].defaultName} line`
};
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

findDefaultLayerProps no longer sets isVisible: false for newly created line layers. This is a behavior change: line layers derived from point pairs may now be visible by default, which differs from the previous default and could surprise users.

If the previous behavior is still desired, restore isVisible: false (or set the default visibility in the layer’s default config instead of relying on this helper).

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants