Skip to content

DOM Form API

Reference DOM Form connection functions, options, participants, submission results, and public types.

Back to the DOM forms guide

API

DOM package: @sectile/dom/form

Functions

defineFormSubmission

ts
function defineFormSubmission<const Schema extends FormSchema<object, object>, ID extends StableID = StableID>(definition: FormSchemaSubmissionDefinition<Schema, ID>): FormSchemaSubmissionDefinition<Schema, ID>
function defineFormSubmission<ID extends StableID = StableID>(definition: FormSubmissionDefinition<ID>): FormSubmissionDefinition<ID>

createForm

ts
function createForm<ID extends StableID = StableID, Input extends object = FormValues, Output extends object = Input>(options: FormOptions<ID, Input, Output>): FormConnection<ID, Input, Output>

tryCreateForm

ts
function tryCreateForm<ID extends StableID = StableID, Input extends object = FormValues, Output extends object = Input>(options: FormOptions<ID, Input, Output>): FormResult<FormConnection<ID, Input, Output>>

appendFormFieldPath

ts
function appendFormFieldPath(base: FormFieldPath, relative: FormRelativePath): readonly FormPathSegment[]

createFormFieldPath

ts
function createFormFieldPath(path: FormFieldPath, limits?: Partial<FormConstructionLimits>): readonly FormPathSegment[]

createFormRelativePath

ts
function createFormRelativePath(path: FormRelativePath, limits?: Partial<FormConstructionLimits>): readonly FormPathSegment[]

encodeFormFieldPath

ts
function encodeFormFieldPath(path: FormFieldPath): string

Types

FormFieldPath

ts
type FormFieldPath = string | readonly FormPathSegment[]

FormPathSegment

ts
type FormPathSegment = string | number

FormRelativePath

ts
type FormRelativePath = FormPathSegment | readonly FormPathSegment[]

FormValues

ts
type FormValues<Shape extends object = Record<string, unknown>> = Readonly<Shape>

FormSchema

ts
type FormSchema<Input = unknown, Output = Input> = StandardSchemaV1<Input, Output>

FormSchemaInput

ts
type FormSchemaInput<Schema extends StandardSchemaV1> = StandardSchemaV1.InferInput<Schema>

FormSchemaOutput

ts
type FormSchemaOutput<Schema extends StandardSchemaV1> = StandardSchemaV1.InferOutput<Schema>

FormReinitializeOptions

NameTypeRequired
preserve{ readonly touched?: boolean; readonly validation?: boolean; readonly submission?: boolean; }

FormValidationIssue

NameTypeRequired
messagestringYes
pathFormFieldPath
relatedPathsreadonly FormFieldPath[]

FormValidationResult

NameTypeRequired
issuesreadonly FormValidationIssue[]

FormInteractionValidationTrigger

ts
type FormInteractionValidationTrigger = Exclude<FormValidationTrigger, 'submit'>

FormValidateContext

NameTypeRequired
triggerFormValidationTriggerYes
intentFormValidationIntentYes
changedFieldIdID | nullYes
signalAbortSignalYes

FormValidateHandler

ts
type FormValidateHandler<ID extends StableID = StableID, Values extends object = FormValues> =
(
  values: Values,
  context: FormValidateContext<ID>,
) => FormValidationResult | PromiseLike<FormValidationResult>

FormFocusHandler

ts
type FormFocusHandler = () => boolean | void

FormResetHandler

ts
type FormResetHandler = () => void

FormReinitializeHandler

ts
type FormReinitializeHandler = (options?: FormReinitializeOptions) => void

FormAnnounceSummaryHandler

ts
type FormAnnounceSummaryHandler<ID extends StableID = StableID> = (issues: readonly FormIssue<ID>[], failure: FormSubmissionFailure | null) => void

FormStateChangeHandler

ts
type FormStateChangeHandler<ID extends StableID = StableID> = (state: FormState<ID>) => void

FormUpdateHandler

ts
type FormUpdateHandler = () => void

FormSubmissionElement

ts
type FormSubmissionElement =
| HTMLButtonElement
  | HTMLInputElement
  | HTMLSelectElement
  | HTMLTextAreaElement

FormParticipant

NameTypeRequired
idIDYes
elementHTMLElementYes
semanticControlHTMLElement
focusTargetHTMLElement
validationTargetHTMLElement
submissionElementsreadonly FormSubmissionElement[]
nameFormFieldPath | null
focusFormFocusHandler
resetFormResetHandler
getValue(() => unknown) | undefined
isValueEqual((current: unknown, baseline: unknown) => boolean) | undefined

FormSubmitPayload

NameTypeRequired
eventSubmitEventYes
formDataFormDataYes
valuesValuesYes
submitterHTMLElement | nullYes
stateFormState<ID>Yes
reinitializeFormReinitializeHandlerYes

FormSubmitResult

ts
type FormSubmitResult<ID extends StableID = StableID> =
| void
  | { readonly ok: true }
  | {
      readonly ok: false;
      readonly failure?: FormSubmissionFailure;
      readonly issues?: readonly FormIssue<ID>[];
    }

FormSubmitHandler

ts
type FormSubmitHandler<ID extends StableID = StableID, Values extends object = FormValues> =
(
  payload: FormSubmitPayload<ID, Values>,
) => FormSubmitResult<ID> | PromiseLike<FormSubmitResult<ID>>

FormSubmissionDefinition

NameTypeRequired
schemanever
onSubmitFormSubmitHandler<ID, Readonly<Record<string, unknown>>>Yes

FormSchemaSubmissionDefinition

NameTypeRequired
schemaSchemaYes
onSubmitFormSubmitHandler<ID, FormSchemaOutput<Schema>>Yes

FormSubmitErrorMapper

ts
type FormSubmitErrorMapper<ID extends StableID = StableID> =
(
  reason: unknown,
) => FormSubmissionFailure

FormSubmitFailureResult

NameTypeRequired
failureFormSubmissionFailure
issuesreadonly FormIssue<ID>[]

FormSnapshot

NameTypeRequired
revisionnumberYes
stateFormState<ID>Yes

FormSubscribeOptions

NameTypeRequired
equals(previous: Selected, next: Selected) => boolean

FormSelector

ts
type FormSelector<ID extends StableID, Selected> = (state: FormState<ID>) => Selected

FormFieldSelector

ts
type FormFieldSelector<ID extends StableID, Selected> = (field: FormFieldState<ID> | null) => Selected

FormSelectionListener

ts
type FormSelectionListener<Selected> = (selected: Selected, previous: Selected) => void

FormOptions

NameTypeRequired
formHTMLFormElementYes
summaryHTMLElement
renderSummaryContentboolean
participantsreadonly FormParticipant<ID>[]
issuesreadonly FormIssue<ID>[]
schemaFormSchema<Input, Output>
validateFormValidateHandler<ID, Input>
validateOnreadonly FormInteractionValidationTrigger[]
revalidateOnreadonly FormInteractionValidationTrigger[]
onSubmitFormSubmitHandler<ID, Output>
mapSubmitErrorFormSubmitErrorMapper<ID>
onResetFormResetHandler
onAnnounceSummaryFormAnnounceSummaryHandler<ID>
onStateChangeFormStateChangeHandler<ID>
onUpdateFormUpdateHandler
onSubscriptionError(error: unknown) => void

FormReconfigureOptions

ts
type FormReconfigureOptions<ID extends StableID = StableID, Input extends object = FormValues, Output extends object = Input> = Omit<FormOptions<ID, Input, Output>, 'form' | 'participants' | 'issues'>

FormConnection

NameTypeRequired
stateFormState<ID>Yes
getSnapshot() => FormSnapshot<ID>Yes
getFormData(submitter?: HTMLElement | null) => FormDataYes
reconfigure(options: FormReconfigureOptions<ID, Input, Output>) => voidYes
registerParticipant(participant: FormParticipant<ID>) => () => voidYes
refreshParticipant(id: ID) => booleanYes
getField(id: ID) => FormFieldState<ID> | nullYes
setFieldMeta(id: ID, meta: FormFieldMetaInput) => booleanYes
replaceFieldIssues(id: ID, source: FormIssueSource, issues: readonly FormIssue<ID>[]) => booleanYes
upsertFieldIssue(id: ID, issue: FormIssue<ID>) => booleanYes
removeFieldIssue(id: ID, issueId: StableID) => booleanYes
clearFieldIssues(id: ID, source?: FormIssueSource) => booleanYes
replaceIssues(source: FormIssueSource, issues: readonly FormIssue<ID>[]) => booleanYes
submitStarted() => number | nullYes
submitSucceeded(generation: number) => booleanYes
submitFailed(generation: number, result: FormSubmitFailureResult<ID>) => booleanYes
reinitialize(options?: FormReinitializeOptions) => voidYes
reset() => voidYes
subscribeForm<Selected>(selector: FormSelector<ID, Selected>, listener: FormSelectionListener<Selected>, options?: FormSubscribeOptions<Selected>) => () => voidYes
subscribeField<Selected>(id: ID, selector: FormFieldSelector<ID, Selected>, listener: FormSelectionListener<Selected>, options?: FormSubscribeOptions<Selected>) => () => voidYes
destroy() => voidYes

Released under the MIT License.