Skip to main content

Core API

import { createFormRuntime } from "formwright/core";

createFormRuntime(input)

Creates the form engine. Call once at module level or in useCreateFormRuntime when context depends on React state.

const runtime = createFormRuntime({
form, // FormDefinition from buildForm()
plugins: registerBasicPlugins(),
context: { mode: "create" }, // optional — available via contextRef() in rules
});
OptionTypeRequiredDescription
formFormDefinitionYesOutput of buildForm()
pluginsFormPlugin[]NoPlugin array (field, operator, effect, datasource, ...)
contextRecord<string, unknown>NoRuntime context, available in rules via contextRef()

Returns: FormRuntime

MethodReturnsDescription
evaluate(values?)RuntimeEvaluationResultRuns all rules against values, returns derived state
getResolvedFields()Record<string, ResolvedFieldModel>Normalized field models after field plugins run
getFormDefinition()FormDefinitionOriginal schema
getResolvedLayout()ResolvedLayoutModelNormalized root layout model
getEvaluationDependencies()string[]Field paths whose changes trigger re-evaluation
getRuntimeContext()RuntimeContextThe context passed at creation
getPluginRegistry()PluginRegistryThe plugin registry
getFieldValidationPlan(path)ValidationPlanItem[]Validation rules for a field
serializeFieldValue(path, value)unknownSerialize a field value via its field plugin
deserializeFieldValue(path, value)unknownDeserialize a field value via its field plugin

evaluate(values?)

Returns:

{
fieldState: Record<string, DerivedFieldState>;
layoutState: Record<string, DerivedLayoutState>;
values: Record<string, unknown>;
}

DerivedFieldState:

{
path: string;
visible: boolean;
disabled: boolean;
readonly: boolean;
required: boolean;
loading?: boolean;
errors?: string[];
}

DerivedLayoutState:

{
id?: string;
visible: boolean;
disabled?: boolean;
}

createPluginRegistry()

Creates a plugin registry manually. Usually not needed — createFormRuntime builds one internally.

import { createPluginRegistry, DuplicatePluginError } from "formwright/core";

const registry = createPluginRegistry();

DuplicatePluginError

Thrown when two plugins have the same identity.name. Catch it during development to identify naming conflicts.