Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .changeset/forty-eyes-fall.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
'@tanstack/angular-form': patch
'@tanstack/preact-form': patch
'@tanstack/svelte-form': patch
'@tanstack/react-form': patch
'@tanstack/solid-form': patch
'@tanstack/form-core': patch
'@tanstack/lit-form': patch
'@tanstack/vue-form': patch
---

Refactor: Form option types are now no longer adapter-specific

Fix: `formOptions.looseSchema`/`strictSchema` now error on missing schema

Fix: `formOptions.looseSchema` now accepts optional `defaultValues` props
3 changes: 2 additions & 1 deletion packages/angular-form/src/form-type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ export type AngularFormType<TOptions extends AnyFormOptions> =
TOptions extends FormOptions<
infer TFormData,
infer TFormValidators,
infer TSubmitReturn
infer TSubmitReturn,
unknown
>
? InternalFormApi<
TFormData,
Expand Down
2 changes: 1 addition & 1 deletion packages/angular-form/src/inject-form.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export function injectForm<
TFormData,
const TFormValidators extends FormValidators<TFormData>,
TSubmitReturn,
>(options: FormOptions<TFormData, TFormValidators, TSubmitReturn>) {
>(options: FormOptions<TFormData, TFormValidators, TSubmitReturn, unknown>) {
const form = new InternalFormApi<TFormData, TFormValidators, TSubmitReturn>(
options,
)
Expand Down
6 changes: 3 additions & 3 deletions packages/form-core/src/FormApi/FormApi.lib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ type InternalFormOptions<
TFormData,
TFormValidators extends FormValidators<TFormData>,
TSubmitReturn,
> = FormOptions<TFormData, TFormValidators, TSubmitReturn> & {
> = FormOptions<TFormData, TFormValidators, TSubmitReturn, unknown> & {
formId: string
}

Expand Down Expand Up @@ -299,7 +299,7 @@ export class InternalFormApi<
}

constructor(
options: FormOptions<TFormData, TFormValidators, any>,
options: FormOptions<TFormData, TFormValidators, any, unknown>,
defaultOptions?: DefaultOptions,
) {
this._defaultOptions = defaultOptions
Expand Down Expand Up @@ -415,7 +415,7 @@ export class InternalFormApi<
this._notifyFormListener('reset', null)
}

_update(options: FormOptions<TFormData, TFormValidators, any>) {
_update(options: FormOptions<TFormData, TFormValidators, any, unknown>) {
const resolvedOptions = resolveDefaultOptions(
options,
this._defaultOptions?.form,
Expand Down
38 changes: 30 additions & 8 deletions packages/form-core/src/FormApi/FormApi.public.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,29 @@ export interface FormSubmitContext<
parseIssues: ParseSubmitIssuesFn<TFormData>
}

/**
* Handles a form submission after submission validation succeeds.
*
* A returned promise is awaited before submission finishes. Return an error
* created by the submission context's `createValidationError` or `parseIssues`
* helper to mark the submission as invalid.
*
* @typeParam TFormData - Library-managed. Do not specify explicitly.
* @typeParam TFormValidators - Library-managed. Do not specify explicitly.
* @typeParam TSubmitReturn - Library-managed. Do not specify explicitly.
*/
export type FormSubmitFn<
in out TFormData,
in out TFormValidators extends FormValidators<TFormData>,
in out TSubmitReturn,
> = (
context: FormSubmitContext<
TFormData,
ToFormSchemaOutputs<TFormValidators>,
ToFormErrorTypes<TFormValidators, unknown>
>,
) => TSubmitReturn

/**
* Context passed to `onSubmitInvalid` when a submission fails.
*
Expand Down Expand Up @@ -204,7 +227,9 @@ export interface FormSubmitInvalidContext<
* Use this alias only when reusable code does not need type-safe access to
* values, validators, or submission results.
*/
export type AnyFormOptions = FormOptions<any, any, any>
export type AnyFormOptions = FormOptions<any, any, any, any>

declare const formOptionsComponentsSymbol: unique symbol

/**
* Configures initial values, validation, listeners, and submission.
Expand All @@ -226,12 +251,15 @@ export type AnyFormOptions = FormOptions<any, any, any>
* @typeParam TFormData - Library-managed. Do not specify explicitly.
* @typeParam TFormValidators - Library-managed. Do not specify explicitly.
* @typeParam TSubmitReturn - Library-managed. Do not specify explicitly.
* @typeParam TComponents - Library-managed. Do not specify explicitly.
*/
export interface FormOptions<
in out TFormData,
in out TFormValidators extends FormValidators<TFormData>,
in out TSubmitReturn,
out TComponents,
> {
readonly [formOptionsComponentsSymbol]?: TComponents
Comment thread
coderabbitai[bot] marked this conversation as resolved.
/**
* A stable identifier for this form.
*
Expand Down Expand Up @@ -352,13 +380,7 @@ export interface FormOptions<
* }
* ```
*/
onSubmit?: (
context: FormSubmitContext<
TFormData,
ToFormSchemaOutputs<TFormValidators>,
ToFormErrorTypes<TFormValidators, unknown>
>,
) => TSubmitReturn
onSubmit?: FormSubmitFn<TFormData, TFormValidators, TSubmitReturn>
/**
* Called after an invalid submission is detected.
*
Expand Down
2 changes: 1 addition & 1 deletion packages/form-core/src/defaultOptions.public.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ interface DefaultListenersMergeOptions {
* ```
*/
export type DefaultFormOptions = Pick<
FormOptions<unknown, FormValidators<unknown>, unknown>,
FormOptions<unknown, FormValidators<unknown>, unknown, unknown>,
'errorVisibility' | 'listeners' | 'onSubmitInvalid'
> &
DefaultListenersMergeOptions
Expand Down
2 changes: 1 addition & 1 deletion packages/form-core/src/ssr.lib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ export async function validateServerValues<
const TFormValidators extends FormValidators<TFormData>,
TSubmitReturn,
>(
options: FormOptions<TFormData, TFormValidators, TSubmitReturn>,
options: FormOptions<TFormData, TFormValidators, TSubmitReturn, unknown>,
values: TFormData,
): Promise<ServerValidateResult<TFormData, TFormValidators>> {
const pipeline = options.validators
Expand Down
6 changes: 3 additions & 3 deletions packages/form-core/src/ssr.public.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ export function serverValidateHelper<
}
}

interface ServerStateValidationResult<TResult> {
interface ServerStateValidationResult<out TResult> {
validatorIndex: number
result: TResult
schemaResult: unknown | null
hasSchemaResult?: boolean
}

interface ServerFormStateByResult<in out TFormData, TResult> {
interface ServerFormStateByResult<in out TFormData, out TResult> {
values: TFormData | undefined
validationResults: Array<ServerStateValidationResult<TResult>>
submissionAttempts: number
Expand Down Expand Up @@ -82,7 +82,7 @@ type ServerValidateFrameworkCreateServerValidate = <
const TFormValidators extends FormValidators<TFormData>,
TSubmitReturn,
>(
formOptions: FormOptions<TFormData, TFormValidators, TSubmitReturn>,
formOptions: FormOptions<TFormData, TFormValidators, TSubmitReturn, unknown>,
pluginOptions?: any,
) => unknown

Expand Down
Loading
Loading