Skip to content

Commit ab5b948

Browse files
authored
Add disableFileValidation() to disable file validation after enabling (#133)
* Add `disableFileValidation()` * Added tests * formatting * Renamed `disableFileValidation` to `withoutFileValidation`
1 parent 35d1c3a commit ab5b948

File tree

13 files changed

+84
-0
lines changed

13 files changed

+84
-0
lines changed

packages/alpine/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ export default function (Alpine: TAlpine) {
160160
validateFiles() {
161161
validator.validateFiles()
162162

163+
return form
164+
},
165+
withoutFileValidation() {
166+
validator.withoutFileValidation()
167+
163168
return form
164169
},
165170
})

packages/alpine/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ export interface Form<Data extends Record<string, unknown>> {
1717
submit(config?: Config): Promise<unknown>,
1818
reset(...keys: string[]): Data & Form<Data>,
1919
validateFiles(): Data & Form<Data>,
20+
withoutFileValidation(): Data & Form<Data>,
2021
}

packages/core/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export interface Validator {
6464
setTimeout(duration: number): Validator,
6565
on(event: keyof ValidatorListeners, callback: () => void): Validator,
6666
validateFiles(): Validator,
67+
withoutFileValidation(): Validator,
6768
}
6869

6970
export interface ValidatorListeners {

packages/core/src/validator.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,11 @@ export const createValidator = (callback: ValidationCallback, initialData: Recor
395395
validateFiles() {
396396
validateFiles = true
397397

398+
return form
399+
},
400+
withoutFileValidation() {
401+
validateFiles = false
402+
398403
return form
399404
},
400405
}

packages/core/tests/validator.test.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,54 @@ it('filters out files', async () => {
325325
await assertPendingValidateDebounceAndClear()
326326
})
327327

328+
it('doesnt filter data when file validation is enabled', async () => {
329+
let config
330+
axios.request.mockImplementationOnce((c) => {
331+
config = c
332+
return Promise.resolve(precognitionSuccessResponse())
333+
})
334+
335+
const data = {
336+
name: 'Tim',
337+
email: null,
338+
avatar: new Blob([], { type: 'image/png' }),
339+
}
340+
341+
const validator = createValidator((client) => client.post('/foo', data))
342+
343+
validator.validateFiles()
344+
validator.validate('text', 'Tim')
345+
346+
expect(config.data).toEqual(data)
347+
348+
await assertPendingValidateDebounceAndClear()
349+
})
350+
351+
it('can disable file validation after enabling it', async () => {
352+
let config
353+
axios.request.mockImplementationOnce((c) => {
354+
config = c
355+
return Promise.resolve(precognitionSuccessResponse())
356+
})
357+
358+
const validator = createValidator((client) => client.post('/foo', {
359+
name: 'Tim',
360+
email: null,
361+
avatar: new Blob([], { type: 'image/png' }),
362+
}))
363+
364+
validator.validateFiles()
365+
validator.withoutFileValidation()
366+
validator.validate('text', 'Tim')
367+
368+
expect(config.data).toEqual({
369+
name: 'Tim',
370+
email: null,
371+
})
372+
373+
await assertPendingValidateDebounceAndClear()
374+
})
375+
328376
it('doesnt mark fields as validated while response is pending', async () => {
329377
expect.assertions(10)
330378

packages/react-inertia/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ export const useForm = <Data extends Record<string, FormDataConvertible>>(method
162162

163163
return form
164164
},
165+
withoutFileValidation() {
166+
precognitiveForm.withoutFileValidation()
167+
168+
return form
169+
},
165170
submit(submitMethod: RequestMethod | Omit<VisitOptions, 'data'> = {}, submitUrl?: string, submitOptions?: Omit<VisitOptions, 'data'>): void {
166171
if (typeof submitMethod !== 'string') {
167172
submitOptions = submitMethod

packages/react-inertia/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export type Form<Data extends Record<string, FormDataConvertible>> = Omit<Precog
1414
submit(method: RequestMethod, url: string, options?: Omit<VisitOptions, 'data'>): void,
1515
reset(...keys: (keyof Partial<Data>)[]): void,
1616
validateFiles(): Form<Data>,
17+
withoutFileValidation(): Form<Data>,
1718
setData(data: Record<string, FormDataConvertible>): Form<Data>,
1819
validate(name?: (keyof Data | NamedInputEvent) | ValidationConfig, config?: ValidationConfig): Form<Data>,
1920
}

packages/react/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@ export const useForm = <Data extends Record<string, unknown>>(method: RequestMet
217217

218218
return form
219219
},
220+
withoutFileValidation() {
221+
validator.current!.withoutFileValidation()
222+
223+
return form
224+
},
220225
validator() {
221226
return validator.current!
222227
},

packages/react/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ export interface Form<Data extends Record<string, unknown>> {
1818
submit(config?: Config): Promise<unknown>,
1919
reset(...names: (keyof Partial<Data>)[]): Form<Data>,
2020
validateFiles(): Form<Data>,
21+
withoutFileValidation(): Form<Data>,
2122
validator(): Validator,
2223
}

packages/vue-inertia/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@ export const useForm = <Data extends Record<string, FormDataConvertible>>(method
168168

169169
return form
170170
},
171+
withoutFileValidation() {
172+
precognitiveForm.withoutFileValidation()
173+
174+
return form
175+
},
171176
submit(submitMethod: RequestMethod | Partial<VisitOptions> = {}, submitUrl?: string, submitOptions?: Partial<VisitOptions>): void {
172177
if (typeof submitMethod !== 'string') {
173178
submitOptions = submitMethod

0 commit comments

Comments
 (0)