Skip to content

Commit a1cda5d

Browse files
committed
feat(data-loaders): adapt colada to support always defined data
1 parent 7cf7796 commit a1cda5d

6 files changed

+324
-34
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
import { describe, it, expectTypeOf } from 'vitest'
2+
import { defineColadaLoader } from './defineColadaLoader'
3+
import type { Ref } from 'vue'
4+
import { NavigationResult } from './navigation-guard'
5+
6+
describe('defineBasicLoader', () => {
7+
interface UserData {
8+
id: string
9+
name: string
10+
}
11+
12+
it('uses typed routes', () => {
13+
const useDataLoader = defineColadaLoader('/[name]', {
14+
key: ['id'],
15+
query: async (route) => {
16+
const user = {
17+
id: route.params.name as string,
18+
name: 'Edu',
19+
}
20+
21+
return user
22+
},
23+
})
24+
25+
expectTypeOf<
26+
| {
27+
data: Ref<UserData>
28+
error: Ref<unknown>
29+
isLoading: Ref<boolean>
30+
reload: () => Promise<void>
31+
}
32+
| PromiseLike<UserData>
33+
>(useDataLoader())
34+
})
35+
36+
const key = ['id']
37+
async function query() {
38+
const user: UserData = {
39+
id: 'one',
40+
name: 'Edu',
41+
}
42+
43+
return user
44+
}
45+
46+
it('can enforce defined data', () => {
47+
expectTypeOf(
48+
defineColadaLoader({ key, query })().data.value
49+
).toEqualTypeOf<UserData>()
50+
expectTypeOf(
51+
defineColadaLoader({
52+
key,
53+
query,
54+
errors: false,
55+
lazy: false,
56+
server: true,
57+
})().data.value
58+
).toEqualTypeOf<UserData>()
59+
expectTypeOf(
60+
defineColadaLoader({
61+
key,
62+
query,
63+
lazy: false,
64+
server: true,
65+
})().data.value
66+
).toEqualTypeOf<UserData>()
67+
expectTypeOf(
68+
defineColadaLoader({
69+
key,
70+
query,
71+
errors: false,
72+
})().data.value
73+
).toEqualTypeOf<UserData>()
74+
expectTypeOf(
75+
defineColadaLoader({
76+
key,
77+
query,
78+
server: true,
79+
})().data.value
80+
).toEqualTypeOf<UserData>()
81+
expectTypeOf(
82+
defineColadaLoader({
83+
key,
84+
query,
85+
lazy: false,
86+
})().data.value
87+
).toEqualTypeOf<UserData>()
88+
})
89+
90+
it('makes data possibly undefined when lazy', () => {
91+
expectTypeOf(
92+
defineColadaLoader({ key, query, lazy: true })().data.value
93+
).toEqualTypeOf<UserData | undefined>()
94+
})
95+
96+
it('makes data possibly undefined when lazy is a function', () => {
97+
expectTypeOf(
98+
defineColadaLoader({ key, query, lazy: () => false })().data.value
99+
).toEqualTypeOf<UserData | undefined>()
100+
})
101+
102+
it('makes data possibly undefined when errors is not false', () => {
103+
expectTypeOf(
104+
defineColadaLoader({ key, query, errors: true })().data.value
105+
).toEqualTypeOf<UserData | undefined>()
106+
expectTypeOf(
107+
defineColadaLoader({ key, query, errors: [] })().data.value
108+
).toEqualTypeOf<UserData | undefined>()
109+
expectTypeOf(
110+
defineColadaLoader({ key, query, errors: () => true })().data.value
111+
).toEqualTypeOf<UserData | undefined>()
112+
})
113+
114+
it('makes data possibly undefined when server is not true', () => {
115+
expectTypeOf(
116+
defineColadaLoader({ key, query, server: false })().data.value
117+
).toEqualTypeOf<UserData | undefined>()
118+
})
119+
120+
it('infers the returned type for data', () => {
121+
expectTypeOf<UserData | undefined>(
122+
defineColadaLoader({ key, query, lazy: true })().data.value
123+
)
124+
expectTypeOf<UserData | undefined>(
125+
defineColadaLoader({ key, query, lazy: () => false })().data.value
126+
)
127+
})
128+
129+
it('infers the returned type for the resolved value to always be defined', async () => {
130+
expectTypeOf(
131+
await defineColadaLoader({ key, query })()
132+
).toEqualTypeOf<UserData>()
133+
expectTypeOf(
134+
await defineColadaLoader({ key, query, lazy: false })()
135+
).toEqualTypeOf<UserData>()
136+
expectTypeOf(
137+
await defineColadaLoader({ key, query, lazy: true })()
138+
).toEqualTypeOf<UserData>()
139+
expectTypeOf(
140+
await defineColadaLoader({ key, query, server: true })()
141+
).toEqualTypeOf<UserData>()
142+
expectTypeOf(
143+
await defineColadaLoader({ key, query, server: false })()
144+
).toEqualTypeOf<UserData>()
145+
expectTypeOf(
146+
await defineColadaLoader({ key, query, errors: false })()
147+
).toEqualTypeOf<UserData>()
148+
expectTypeOf(
149+
await defineColadaLoader({ key, query, errors: true })()
150+
).toEqualTypeOf<UserData>()
151+
expectTypeOf(
152+
await defineColadaLoader({ key, query, errors: [] })()
153+
).toEqualTypeOf<UserData>()
154+
expectTypeOf(
155+
await defineColadaLoader({ key, query, errors: false, lazy: true })()
156+
).toEqualTypeOf<UserData>()
157+
expectTypeOf(
158+
await defineColadaLoader({ key, query, server: false, lazy: true })()
159+
).toEqualTypeOf<UserData>()
160+
expectTypeOf(
161+
await defineColadaLoader({
162+
key,
163+
query,
164+
errors: false,
165+
server: false,
166+
lazy: true,
167+
})()
168+
).toEqualTypeOf<UserData>()
169+
})
170+
171+
it('allows returning a Navigation Result without a type error', () => {
172+
expectTypeOf<UserData>(
173+
defineColadaLoader({
174+
key,
175+
query: async () => {
176+
if (Math.random()) {
177+
return query()
178+
} else {
179+
return new NavigationResult('/')
180+
}
181+
},
182+
})().data.value
183+
)
184+
expectTypeOf(
185+
defineColadaLoader({
186+
key,
187+
query: async () => {
188+
if (Math.random()) {
189+
return query()
190+
} else {
191+
return new NavigationResult('/')
192+
}
193+
},
194+
})()
195+
).resolves.toEqualTypeOf<UserData>()
196+
})
197+
})

0 commit comments

Comments
 (0)