Skip to content

Commit 38d27b9

Browse files
authored
Support Inertia transform (#72)
* Support Inertia transform with Vue * Support Inertia transform with React * lint
1 parent 7c63060 commit 38d27b9

File tree

3 files changed

+95
-4
lines changed

3 files changed

+95
-4
lines changed

packages/react-inertia/src/index.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ export const useForm = <Data extends Record<string, unknown>>(method: RequestMet
4343
*/
4444
const inertiaSetData = inertiaForm.setData.bind(inertiaForm)
4545

46+
/**
47+
* The Inertia trasform function.
48+
*/
49+
const inertiaTransform = inertiaForm.transform.bind(inertiaForm)
50+
51+
/**
52+
* The transform function.
53+
*/
54+
const transformer = useRef<(data: Data) => Data>((data) => data)
55+
4656
if (! booted.current) {
4757
/**
4858
* Setup event listeners.
@@ -116,8 +126,15 @@ export const useForm = <Data extends Record<string, unknown>>(method: RequestMet
116126

117127
return form
118128
},
129+
transform(callback: (data: Data) => Data) {
130+
inertiaTransform(callback)
131+
132+
transformer.current = callback
133+
134+
return form
135+
},
119136
validate(name?: string|NamedInputEvent) {
120-
precognitiveForm.setData(inertiaForm.data)
137+
precognitiveForm.setData(transformer.current(inertiaForm.data))
121138

122139
precognitiveForm.validate(name)
123140

packages/vue-inertia/src/index.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ export const useForm = <Data extends Record<string, unknown>>(method: RequestMet
4848
*/
4949
const inertiaSetError = inertiaForm.setError.bind(inertiaForm)
5050

51+
/**
52+
* The Inertia trasform function.
53+
*/
54+
const inertiaTransform = inertiaForm.transform.bind(inertiaForm)
55+
56+
/**
57+
* The transform function.
58+
*/
59+
let transformer: (data: Data) => Record<string, unknown> = (data) => data
60+
5161
/**
5262
* Patch the form.
5363
*/
@@ -98,8 +108,15 @@ export const useForm = <Data extends Record<string, unknown>>(method: RequestMet
98108

99109
return form
100110
},
111+
transform(callback: (data: Data) => Record<string, unknown>) {
112+
inertiaTransform(callback)
113+
114+
transformer = callback
115+
116+
return form
117+
},
101118
validate(name?: string|NamedInputEvent) {
102-
precognitiveForm.setData(inertiaForm.data())
119+
precognitiveForm.setData(transformer(inertiaForm.data()))
103120

104121
precognitiveForm.validate(name)
105122

packages/vue-inertia/tests/index.test.ts

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
1-
import { it, expect } from 'vitest'
2-
import { useForm } from '../src/index'
1+
import { it, expect, beforeEach, afterEach, vi } from 'vitest'
2+
import { useForm, client } from '../src/index'
3+
import axios from 'axios'
4+
import { Config } from 'laravel-precognition'
5+
6+
beforeEach(() => {
7+
vi.mock('axios')
8+
client.use(axios)
9+
})
10+
11+
afterEach(() => {
12+
vi.restoreAllMocks()
13+
})
314

415
it('can clear all errors via Inertia\'s clearErrors', () => {
516
const form = useForm('post', '/register', {
@@ -44,3 +55,49 @@ it('can clear specific errors via Inertia\'s clearErrors', () => {
4455
other: ['xxxx'],
4556
})
4657
})
58+
59+
it('provides default data for validation requets', () => {
60+
const response = { headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: 'data' }
61+
62+
let config: Config
63+
axios.request.mockImplementation(async (c: Config) => {
64+
config = c
65+
66+
return response
67+
})
68+
69+
const form = useForm('post', '/register', {
70+
emails: '',
71+
})
72+
73+
form.emails = 'taylor@laravel.com, tim@laravel.com'
74+
form.validate('emails')
75+
76+
expect(config!.data.emails).toEqual('taylor@laravel.com, tim@laravel.com')
77+
expect(form.emails).toBe('taylor@laravel.com, tim@laravel.com')
78+
expect(form.data().emails).toBe('taylor@laravel.com, tim@laravel.com')
79+
})
80+
81+
it('transforms data for validation requests', () => {
82+
const response = { headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: 'data' }
83+
84+
let config: Config
85+
axios.request.mockImplementation(async (c: Config) => {
86+
config = c
87+
88+
return response
89+
})
90+
91+
const form = useForm('post', '/register', {
92+
emails: '',
93+
}).transform((data) => ({
94+
emails: data.emails.split(',').map(email => email.trim()),
95+
}))
96+
97+
form.emails = 'taylor@laravel.com, tim@laravel.com'
98+
form.validate('emails')
99+
100+
expect(config!.data.emails).toEqual(['taylor@laravel.com', 'tim@laravel.com'])
101+
expect(form.emails).toBe('taylor@laravel.com, tim@laravel.com')
102+
expect(form.data().emails).toBe('taylor@laravel.com, tim@laravel.com')
103+
})

0 commit comments

Comments
 (0)