JSON format rendering components for deck.gl that enable declarative specification of visualization layers through JSON configuration
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Configuration system for managing available classes, functions, constants, and conversion settings for JSON to JavaScript object conversion.
Configuration manager that defines available classes, functions, constants, enums, and conversion behavior.
/**
* Configuration manager for JSON conversion settings
*/
class JSONConfiguration {
/** Key used to identify class types in JSON (default: '@@type') */
typeKey: string;
/** Key used to identify function objects in JSON (default: '@@function') */
functionKey: string;
/** Registry of available classes for instantiation */
classes: Record<string, any>;
/** Registry of React components for JSX creation */
reactComponents: Record<string, any>;
/** Registry of enum values for constant resolution */
enumerations: Record<string, any>;
/** Registry of constant values for constant resolution */
constants: Record<string, any>;
/** Registry of available functions for function objects */
functions: Record<string, Function>;
/** React instance for creating React components */
React: any;
/** Function for converting expression strings to functions */
convertFunction: (propValue: string, configuration: JSONConfiguration) => Function;
/** Hook for preprocessing class props before instantiation */
preProcessClassProps: (Class: any, props: any, configuration?: JSONConfiguration) => any;
/** Hook for post-processing converted JSON */
postProcessConvertedJson: (json: any) => any;
/** Logger instance for warnings and errors */
log: any;
/**
* Creates a new configuration by merging provided configurations
* @param configurations - Configuration objects to merge
*/
constructor(...configurations: any[]);
/**
* Merges a configuration object into this configuration
* @param configuration - Configuration object to merge
*/
merge(configuration: any): void;
/**
* Validates the configuration object
* @param configuration - Configuration to validate
* @returns True if valid
*/
validate(configuration: any): boolean;
}Usage Examples:
import { JSONConfiguration } from "@deck.gl/json";
import { ScatterplotLayer, HeatmapLayer } from "@deck.gl/layers";
import { MapView, OrbitView } from "@deck.gl/core";
import { COORDINATE_SYSTEM } from "@deck.gl/core";
// Basic configuration
const config = new JSONConfiguration({
classes: {
ScatterplotLayer,
HeatmapLayer,
MapView,
OrbitView
},
enumerations: {
COORDINATE_SYSTEM
},
constants: {
DEFAULT_RADIUS: 100,
DEFAULT_COLOR: [255, 0, 0]
}
});
// Configuration with custom functions
const configWithFunctions = new JSONConfiguration({
classes: { ScatterplotLayer },
functions: {
calculateRadius: (props) => props.base * props.multiplier,
generateColor: (props) => [props.r, props.g, props.b]
}
});
// Multiple configuration merging
const baseConfig = new JSONConfiguration({
classes: { ScatterplotLayer }
});
const extendedConfig = new JSONConfiguration(
baseConfig,
{
classes: { HeatmapLayer },
constants: { MY_CONSTANT: 42 }
}
);
// Runtime configuration merging
config.merge({
constants: {
NEW_CONSTANT: "value"
}
});Maps string identifiers to JavaScript classes for instantiation:
{
classes: {
"ScatterplotLayer": ScatterplotLayer,
"HeatmapLayer": HeatmapLayer
}
}
// Enables JSON like:
{
"@@type": "ScatterplotLayer",
"id": "my-layer"
}Maps enum names and values for constant resolution:
{
enumerations: {
"COORDINATE_SYSTEM": {
"DEFAULT": 0,
"LNGLAT": 1,
"METER_OFFSETS": 2
}
}
}
// Enables JSON like:
{
"coordinateSystem": "@@#COORDINATE_SYSTEM.DEFAULT"
}Maps constant names to values:
{
constants: {
"DEFAULT_RADIUS": 100,
"PRIMARY_COLOR": [255, 0, 0]
}
}
// Enables JSON like:
{
"radius": "@@#DEFAULT_RADIUS",
"color": "@@#PRIMARY_COLOR"
}Maps function names to executable functions:
{
functions: {
"calculateRadius": (props) => props.base * props.multiplier,
"formatLabel": (props) => `${props.prefix}: ${props.value}`
}
}
// Enables JSON like:
{
"@@function": "calculateRadius",
"base": 10,
"multiplier": 2
}Maps component names to React components for JSX creation:
{
reactComponents: {
"CustomTooltip": CustomTooltipComponent
},
React: React // React instance required
}Modify class properties before instantiation:
const config = new JSONConfiguration({
classes: { ScatterplotLayer },
preProcessClassProps: (Class, props, configuration) => {
// Add default properties
if (Class === ScatterplotLayer && !props.radiusScale) {
props.radiusScale = 1;
}
return props;
}
});Modify the final converted result:
const config = new JSONConfiguration({
classes: { ScatterplotLayer },
postProcessConvertedJson: (json) => {
// Add metadata to all layer objects
if (json.layers) {
json.layers.forEach(layer => {
layer._metadata = { convertedAt: Date.now() };
});
}
return json;
}
});Override default expression parsing:
import customExpressionParser from './my-parser';
const config = new JSONConfiguration({
convertFunction: customExpressionParser
});The configuration validates:
typeKey is a stringclasses is an objectFor backwards compatibility, the configuration accepts deprecated properties:
{
// DEPRECATED: Use 'classes' instead
layers: { ScatterplotLayer },
views: { MapView }
}These are automatically merged into the classes registry.
Install with Tessl CLI
npx tessl i tessl/npm-deck-gl--json