{"record":{"id":"ba5e4c7e8f436e46","repo":"apache/superset","slug":"unknown-deck-gl-layer-type-viztype","errorCode":null,"errorMessage":"Unknown deck.gl layer type: ${vizType}","messagePattern":"Unknown deck\\.gl layer type: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"superset-frontend/plugins/preset-chart-deckgl/src/Multi/Multi.tsx","lineNumber":379,"sourceCode":"          adhoc_filters: adhocFilters,\n          // Preserve dashboard context for embedded mode permissions\n          ...(formData.dashboardId && { dashboardId: formData.dashboardId }),\n          // Include parent multilayer chart ID for security checks\n          ...(formData.slice_id && { parent_slice_id: formData.slice_id }),\n        },\n      } as any as JsonObject & { slice_id: number };\n\n      const vizType = subsliceCopy.form_data.viz_type as string;\n      Promise.all([\n        getChartBuildQueryRegistry().get(vizType),\n        getChartTransformPropsRegistry().get(vizType),\n      ])\n        .then(([layerBuildQuery, layerTransformProps]) => {\n          if (\n            typeof layerBuildQuery !== 'function' ||\n            typeof layerTransformProps !== 'function'\n          ) {\n            throw new Error(`Unknown deck.gl layer type: ${vizType}`);\n          }\n          const queryContext = layerBuildQuery(\n            subsliceCopy.form_data as QueryFormData,\n          );\n          return SupersetClient.post({\n            endpoint: '/api/v1/chart/data',\n            jsonPayload: {\n              ...queryContext,\n              result_format: 'json',\n              // 'full' takes the async-query handoff under\n              // GLOBAL_ASYNC_QUERIES, and this call never registers a\n              // listener to follow that job, so a cold cache means the\n              // layer just never renders. 'results' returns the same\n              // data/colnames/coltypes this reads, skips the async path\n              // entirely.\n              result_type: 'results',\n            },\n          }).then(({ json }) => {","sourceCodeStart":361,"sourceCodeEnd":397,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset-frontend/plugins/preset-chart-deckgl/src/Multi/Multi.tsx#L361-L397","documentation":"The deck.gl Multi chart resolves each sub-chart's buildQuery and transformProps from the chart registry using its viz_type. If either lookup returns something that is not a function (unregistered or not-yet-loaded plugin), it throws 'Unknown deck.gl layer type'. This typically means the sub-chart is not a registered deck.gl layer.","triggerScenarios":"A Multi deck.gl chart whose subslices include a viz_type that is not a deck.gl layer or whose plugin was never registered (lazy chunk not loaded, plugin disabled, or a custom viz missing from the preset).","commonSituations":"Custom deck.gl plugin not added to the frontend preset/chart registration; chart JSON imported referencing a viz_type that the deployment does not have; async chunk load failure leaving the registry entry undefined.","solutions":["Verify each sub-chart's viz_type is a registered deck.gl layer in this deployment (check Chart plugin list / presets).","Register the missing plugin in the frontend preset (or enable the extension that provides it) and rebuild.","Remove the offending sub-chart from the Multi layout and re-add it from a known-good layer type.","For lazy-loaded plugins, ensure the buildQuery registry entry is awaited before rendering (the code already awaits the registry promise — confirm the plugin chunk actually loads without network errors)."],"exampleFix":"// before\nconst vizType = subsliceCopy.form_data.viz_type as string;\n\n// after\nimport { getChartBuildQueryRegistry } from '@superset-ui/core';\nconst vizType = subsliceCopy.form_data.viz_type as string;\nconst registered = await getChartBuildQueryRegistry().get(vizType);\nif (typeof registered !== 'function') {\n  addDangerToast(t('Layer type %s is not available in this deployment', vizType));\n  return null;\n}","handlingStrategy":"type-guard","validationCode":"import { getChartBuildQueryRegistry, getChartTransformPropsRegistry } from '@superset-ui/core';\n\nconst [bq, tp] = await Promise.all([\n  getChartBuildQueryRegistry().get(vizType),\n  getChartTransformPropsRegistry().get(vizType),\n]);\nconst isKnownLayer = typeof bq === 'function' && typeof tp === 'function';","typeGuard":"async function isRegisteredDeckLayer(vizType: string): Promise<boolean> {\n  const [bq, tp] = await Promise.all([\n    getChartBuildQueryRegistry().get(vizType),\n    getChartTransformPropsRegistry().get(vizType),\n  ]);\n  return typeof bq === 'function' && typeof tp === 'function';\n}","tryCatchPattern":"if (!(await isRegisteredDeckLayer(vizType))) {\n  addDangerToast(t('Layer type %s is not available; skipping', vizType));\n  continue;\n}","preventionTips":["Register all deck.gl plugins your dashboards reference in the frontend preset before shipping.","Keep exports/imports of Multi deck.gl charts within deployments that share the same plugin set.","Watch the network tab for failed lazy plugin chunks when sub-charts misbehave."],"tags":["deckgl","multi-chart","plugin-registry","visualization"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}