Framework without React
The form framework can be used without React for managing validations in a serverside environment
import { createForm, createValidate, getValidations, FormState,} from "@snsw-forms/form"import { Path } from "@snsw-forms/utils/object/path"import { shallowEqualArray } from "@selkt/core" function alertValidations(form: FormState) { const validations = getValidations(form) alert( validations.length + " validations: \n" + validations.map((validation) => validation.element).join("\n") )} async function run(e) { e.target.disabled = true const form = createForm({ applicant: { name: "", age: "", }, child: { name: "", age: "", }, }) const createIndividualValidation = (path: string) => { createValidate(form, { path: Path([path, "age"]), invalid: (age) => !age || age < 18, element: `${path} must be older than 17`, }).start() createValidate(form, { path: `${path}${Path.SEP}name`, invalid: (name) => !name || name.length < 3, element: `${path}'s name must be longer than 3 chars`, }).start() createValidate(form, { path: [path, "name"], select: (state) => [state.applicant.name, state.child.name], equalityCheck: shallowEqualArray, invalid: (names) => { console.log({ names }) return new Set(names).size !== names.length }, element: `${path}'s name must be unique`, }).start() } createIndividualValidation("applicant") createIndividualValidation("child") let submitResult = await form.submit(() => { alert("First attempt") }) // SubmitResult { submitted: boolean, result: ReturnType<Callback> } alertValidations(form) form.update((value) => { value.applicant.age = "44" value.applicant.name = "John" }) alertValidations(form) form.update((value) => { value.child.age = "22" value.child.name = "John" }) alertValidations(form) submitResult = await form.submit(() => { alert("Second attempt") }) alertValidations(form) form.update((value) => { value.child.name = "Mary" }) submitResult = await form.submit(() => { alert("Third attempt") }) e.target.disabled = false} render(<button onClick={run}>Run demo</button>)