@@ -38,7 +38,7 @@ import {
3838 type UnknownEntryConverter
3939} from '../internal/convert-form-data-entry.js' ;
4040
41- export interface FormHandlerOptions < SendData extends boolean > extends IdOptions {
41+ export interface FormHandlerOptions extends IdOptions {
4242 schema : Schema ;
4343 uiSchema ?: UiSchemaRoot ;
4444 uiOptionsRegistry ?: UiOptionsRegistry ;
@@ -48,7 +48,7 @@ export interface FormHandlerOptions<SendData extends boolean> extends IdOptions
4848 createEntryConverter ?: Creatable < EntryConverter < FormDataEntryValue > , FormDataConverterOptions > ;
4949 convertUnknownEntry ?: UnknownEntryConverter ;
5050 /** @default false */
51- sendData ?: SendData ;
51+ sendData ?: boolean | 'withoutClientSideUpdate' ;
5252 /** By default, handles conversion of `File` */
5353 createReviver ?: ( formData : FormData ) => ( key : string , value : any ) => any ;
5454}
@@ -62,7 +62,7 @@ function createDefaultReviver(formData: FormData) {
6262 } ;
6363}
6464
65- export function createFormHandler < SendData extends boolean > ( {
65+ export function createFormHandler ( {
6666 schema,
6767 uiSchema = { } ,
6868 uiOptionsRegistry = { } ,
@@ -73,9 +73,9 @@ export function createFormHandler<SendData extends boolean>({
7373 idSeparator = DEFAULT_ID_SEPARATOR ,
7474 idIndexSeparator = DEFAULT_INDEX_SEPARATOR ,
7575 idPseudoSeparator = DEFAULT_ID_PSEUDO_SEPARATOR ,
76- sendData,
76+ sendData = false ,
7777 createReviver = createDefaultReviver
78- } : FormHandlerOptions < SendData > ) {
78+ } : FormHandlerOptions ) {
7979 const validator : Validator = create ( createValidator , {
8080 schema,
8181 uiSchema,
@@ -98,13 +98,7 @@ export function createFormHandler<SendData extends boolean>({
9898 return async (
9999 signal : AbortSignal ,
100100 formData : FormData
101- ) : Promise <
102- [
103- ValidatedFormData < SendData > ,
104- FormValue ,
105- ( errors : ValidationError [ ] ) => ValidatedFormData < SendData >
106- ]
107- > => {
101+ ) : Promise < [ ValidatedFormData , FormValue , ( errors : ValidationError [ ] ) => ValidatedFormData ] > => {
108102 const idPrefix = formData . get ( SJSF_ID_PREFIX ) ;
109103 if ( typeof idPrefix !== 'string' ) {
110104 throw new Error ( `"${ SJSF_ID_PREFIX } " key is missing in FormData or not a string` ) ;
@@ -129,24 +123,25 @@ export function createFormHandler<SendData extends boolean>({
129123 ? validator . validateFormValue ( schema , data )
130124 : [ ] ;
131125 function validated ( errors : ValidationError [ ] ) {
126+ const isValid = errors . length === 0
132127 return {
133128 idPrefix : idPrefix as string ,
134- isValid : errors . length === 0 ,
135- sendData,
136- data : ( sendData ? data : undefined ) as SendData extends true ? FormValue : undefined ,
129+ isValid,
130+ data : sendData ? data : undefined ,
131+ updateData : ! isValid && ( sendData === 'withoutClientSideUpdate' ? false : sendData ) ,
137132 errors
138- } satisfies ValidatedFormData < SendData > ;
133+ } satisfies ValidatedFormData ;
139134 }
140135 return [ validated ( errors ) , data , validated ] ;
141136 } ;
142137}
143138
144- export function isValid < T > ( vfd : ValidatedFormData < boolean > , data : unknown ) : data is T {
139+ export function isValid < T > ( vfd : ValidatedFormData , data : unknown ) : data is T {
145140 return vfd . isValid ;
146141}
147142
148- type FormRecord < F extends string , SendData extends boolean > = {
149- [ K in F ] : ValidatedFormData < SendData > ;
143+ type FormRecord < F extends string > = {
144+ [ K in F ] : ValidatedFormData ;
150145} ;
151146
152147interface FormMeta {
@@ -155,11 +150,10 @@ interface FormMeta {
155150
156151export function createAction <
157152 const F extends string ,
158- const SendData extends boolean ,
159153 E extends RequestEvent ,
160154 R extends Record < string , any > | void
161155> (
162- options : FormHandlerOptions < SendData > & {
156+ options : FormHandlerOptions & {
163157 name : F ;
164158 } ,
165159 userAction : (
@@ -169,26 +163,24 @@ export function createAction<
169163 ) => MaybePromise < ValidationError [ ] | R | void >
170164) {
171165 const handle = createFormHandler ( options ) ;
172- return async (
173- event : E
174- ) : Promise < ( FormRecord < F , SendData > & R ) | ActionFailure < FormRecord < F , SendData > > > => {
166+ return async ( event : E ) : Promise < ( FormRecord < F > & R ) | ActionFailure < FormRecord < F > > > => {
175167 const [ form , data , validated ] = await handle (
176168 event . request . signal ,
177169 await event . request . formData ( )
178170 ) ;
179171 if ( ! form . isValid ) {
180- return fail ( 400 , { [ options . name ] : form } as FormRecord < F , SendData > ) ;
172+ return fail ( 400 , { [ options . name ] : form } as FormRecord < F > ) ;
181173 }
182174 let result = await userAction ( data , event , form ) ;
183175 if ( Array . isArray ( result ) ) {
184176 if ( result . length > 0 ) {
185177 return fail ( 400 , {
186178 [ options . name ] : validated ( result )
187- } as FormRecord < F , SendData > ) ;
179+ } as FormRecord < F > ) ;
188180 } else {
189181 result = undefined ;
190182 }
191183 }
192- return { ...result , [ options . name ] : form } as FormRecord < F , SendData > & R ;
184+ return { ...result , [ options . name ] : form } as FormRecord < F > & R ;
193185 } ;
194186}
0 commit comments