@gluonjs/json-forms / packages/json-forms/src / JsonSchema
Interface: JsonSchema
The supported JSON Schema subset rendered by the JSON Forms component.
Properties
$defs?
readonlyoptional$defs?:Readonly<Record<string,JsonSchema>>
$ref?
readonlyoptional$ref?:string
additionalProperties?
readonlyoptionaladditionalProperties?:boolean
allOf?
readonlyoptionalallOf?: readonlyJsonSchema[]
anyOf?
readonlyoptionalanyOf?: readonlyJsonSchema[]
default?
readonlyoptionaldefault?:JsonValue
definitions?
readonlyoptionaldefinitions?:Readonly<Record<string,JsonSchema>>
Legacy JSON Schema definitions are accepted only for local references.
description?
readonlyoptionaldescription?:string
enum?
readonlyoptionalenum?: readonly (string|number)[]
enumNames?
readonlyoptionalenumNames?: readonlystring[]
format?
readonlyoptionalformat?:string
items?
readonlyoptionalitems?:JsonSchema
maximum?
readonlyoptionalmaximum?:number
maxItems?
readonlyoptionalmaxItems?:number
maxLength?
readonlyoptionalmaxLength?:number
minimum?
readonlyoptionalminimum?:number
minItems?
readonlyoptionalminItems?:number
minLength?
readonlyoptionalminLength?:number
oneOf?
readonlyoptionaloneOf?: readonlyJsonSchema[]
properties?
readonlyoptionalproperties?:Readonly<Record<string,JsonSchema>>
readOnly?
readonlyoptionalreadOnly?:boolean
required?
readonlyoptionalrequired?: readonlystring[]
title?
readonlyoptionaltitle?:string
type?
readonlyoptionaltype?:string| readonlystring[]
Example
Define the initial direct-property JSON Schema subset as a checked public contract:
import {
createJsonFormsMessageProvider,
createJsonFormsRendererRegistry,
isJsonFormsRendererRegistry,
JsonForm,
JsonSchemaResolutionError,
jsonFormsTag,
registerJsonForms,
resolveJsonSchema,
type JsonFormChangeDetail,
type JsonFormField,
type JsonFormOptions,
type JsonFormsElement,
type JsonFormsMessageOverrides,
type JsonFormsMessageProvider,
type JsonFormsMessageProviderOptions,
type JsonFormsRendererContext,
type JsonFormsRendererControl,
type JsonFormsRendererKind,
type JsonFormsRendererRegistration,
type JsonFormsRendererSelector,
type JsonFormsUiSchema,
type JsonFormValidationChangeDetail,
type JsonFormValidationError,
type JsonObject,
type JsonSchema,
type JsonSchemaResolutionOptions,
type JsonValue,
} from '@gluonjs/json-forms';
const schema = { type: 'object', properties: { email: { $ref: '#/$defs/email' }, delivery: { type: 'string', enum: ['morning', 'afternoon'] } }, required: ['email'], $defs: { email: { type: 'string', format: 'email' } } } satisfies JsonSchema;
const referenceOptions = { maxDepth: 8, maxNodes: 64 } satisfies JsonSchemaResolutionOptions;
const resolvedSchema = resolveJsonSchema(schema, referenceOptions);
const referenceError = new JsonSchemaResolutionError('ref-pointer', 'Invalid reference.');
const uischema = { type: 'VerticalLayout', elements: [{ type: 'Control', scope: '#/properties/email', label: 'Email address' }, { type: 'Control', scope: '#/properties/delivery' }] } satisfies JsonFormsUiSchema;
const data = { email: 'hello@example.test', delivery: 'morning' } satisfies JsonObject;
const value: JsonValue = data.delivery;
const errors: readonly JsonFormValidationError[] = [];
const change: JsonFormChangeDetail = { data, errors };
const validation: JsonFormValidationChangeDetail = { valid: true, errors };
const messageOverrides = { selectPlaceholder: (required: boolean) => required ? 'Choose one' : 'No selection' } satisfies JsonFormsMessageOverrides;
const messageOptions = { locale: 'en-GB', messages: messageOverrides } satisfies JsonFormsMessageProviderOptions;
const messages: JsonFormsMessageProvider = createJsonFormsMessageProvider(messageOptions);
const rendererKind: JsonFormsRendererKind = 'select';
const rendererSelector = { kind: rendererKind, path: ['delivery'] } satisfies JsonFormsRendererSelector;
const rendererRegistration = { id: 'delivery-summary', selector: rendererSelector, priority: 10, render: (context: JsonFormsRendererContext) => String(context.value ?? '') } satisfies JsonFormsRendererRegistration;
const rendererRegistry = createJsonFormsRendererRegistry([rendererRegistration]);
registerJsonForms();
const element = document.createElement(jsonFormsTag) as JsonFormsElement;
element.schema = schema;
element.uischema = uischema;
element.data = data;
element.messages = messages;
element.rendererRegistry = rendererRegistry;
const rendererControl: JsonFormsRendererControl | undefined = undefined;
const field: JsonFormField | undefined = undefined;
const options = { schema, uischema, data, messages, rendererRegistry, onChange: (event) => console.log(event.detail.data), onValidationChange: (event) => console.log(event.detail.valid) } satisfies JsonFormOptions;
const view = JsonForm(options);
console.log(element.value, value, change, validation, isJsonFormsRendererRegistry(rendererRegistry), rendererControl, field, view, resolvedSchema, referenceError.keyword);