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
});
| Option | Type | Required | Description |
|---|---|---|---|
form | FormDefinition | Yes | Output of buildForm() |
plugins | FormPlugin[] | No | Plugin array (field, operator, effect, datasource, ...) |
context | Record<string, unknown> | No | Runtime context, available in rules via contextRef() |
Returns: FormRuntime
| Method | Returns | Description |
|---|---|---|
evaluate(values?) | RuntimeEvaluationResult | Runs all rules against values, returns derived state |
getResolvedFields() | Record<string, ResolvedFieldModel> | Normalized field models after field plugins run |
getFormDefinition() | FormDefinition | Original schema |
getResolvedLayout() | ResolvedLayoutModel | Normalized root layout model |
getEvaluationDependencies() | string[] | Field paths whose changes trigger re-evaluation |
getRuntimeContext() | RuntimeContext | The context passed at creation |
getPluginRegistry() | PluginRegistry | The plugin registry |
getFieldValidationPlan(path) | ValidationPlanItem[] | Validation rules for a field |
serializeFieldValue(path, value) | unknown | Serialize a field value via its field plugin |
deserializeFieldValue(path, value) | unknown | Deserialize 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.