Skip to content
Backlit
Esc
navigateopen⌘Jpreview
On this page

SDK extensions

Add server behavior and keep field conversion explicit.

A BacklitExtension is a function that registers server behavior and returns { name, version }. Import the type from @backlit/sdk/types. Pass extension functions to defineApp({ extensions, areas }).

An app runs each function identity once. A second app can run the same function again. Registries and factory macros are process-wide, so extension changes affect all apps in that process. Later registrations replace earlier ones. Two functions with the same extension name both run and produce a warning.

Factories and macros

FieldsFactory, FiltersFactory, WidgetsFactory, and ChartsFactory extend Macroable. Use their static macro API to add factory methods. Declare the new method through TypeScript module augmentation. Extend the matching open protocol registry in @backlit/contract, then install a matching client renderer. Runtime registration and type augmentation are both required.

Remappers

remappers is the process-wide FieldRemappers instance. Use registerRole(role, map) for a complete role map. Use registerRemappers(role, partialMap) to replace entries in an existing role. Registering replacements for an unknown role throws.

A FieldRemapper receives (value, field, record, parent, report). Return the converted value. Call report(reason) when conversion fails. The returned undefined causes the value to be omitted. Preserve null when it is a valid empty value. The remapper converts data; the client formats its display.

Built-in maps cover text, number, boolean, date, enum, and group fields for display and input. Relation builders handle related records themselves. A missing role handler reports a defect and uses the requested fallback role. A missing fallback handler throws E_MISSING_FIELD_REMAPPER.

Defect reporters

Use .onDefect(reporter) on a data block or form. A defect has a reason and can include field, kind, value, and row index. The default warnOnDefect writes a warning. A custom reporter can throw new Error(defect.reason) to stop on invalid data during development.

An invalid declaration, duplicate name, missing required position, or invalid target argument is an authoring error. These errors throw. A failed data conversion is a defect. The block can keep its other valid values.

Builder contracts

Import TO_NODE, RESOLVE, RESOLVE_FOR, TO_RESPONSE, FIELD_NAME, FIELD_VALUE, FIELD_ROW, VALUE_FOR, KEYWORD, and PARSE from @backlit/sdk/symbols. Import contract types from @backlit/sdk/types. Nodeable creates a node synchronously. Resolvable creates it asynchronously and can locate a zone. Respondable creates a response. Field builders carry their field name and value type and convert record values through VALUE_FOR.

The generated SDK API, types, and symbols include all exported declarations and helper functions. Prefer public factories when you author an application. See Field roles for a complete custom role.

Was this page helpful?