Skip to content

Commit a3f15f3

Browse files
committed
fix(vue-query): add shallow option, strip readonly in prod mode
1 parent dcd4e58 commit a3f15f3

File tree

5 files changed

+67
-33
lines changed

5 files changed

+67
-33
lines changed

packages/vue-query/src/useBaseQuery.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
computed,
33
getCurrentScope,
44
onScopeDispose,
5+
readonly,
56
shallowReactive,
67
shallowReadonly,
78
toRefs,
@@ -145,7 +146,7 @@ export function useBaseQuery<
145146
return new Promise<QueryObserverResult<TData, TError>>(
146147
(resolve, reject) => {
147148
let stopWatch = () => {
148-
//noop
149+
// noop
149150
}
150151
const run = () => {
151152
if (defaultedOptions.value.enabled !== false) {
@@ -201,7 +202,15 @@ export function useBaseQuery<
201202
},
202203
)
203204

204-
const object: any = toRefs(shallowReadonly(state))
205+
const readonlyState =
206+
process.env.NODE_ENV === 'production'
207+
? state
208+
: // @ts-expect-error
209+
defaultedOptions.value.shallow
210+
? shallowReadonly(state)
211+
: readonly(state)
212+
213+
const object: any = toRefs(readonlyState)
205214
for (const key in state) {
206215
if (typeof state[key as keyof typeof state] === 'function') {
207216
object[key] = state[key as keyof typeof state]

packages/vue-query/src/useInfiniteQuery.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ export type UseInfiniteQueryOptions<
4949
TPageParam
5050
>[Property]
5151
>
52+
} & {
53+
shallow?: boolean
5254
}
5355

5456
export type UseInfiniteQueryReturnType<TData, TError> = UseBaseQueryReturnType<

packages/vue-query/src/useMutation.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
computed,
33
getCurrentScope,
44
onScopeDispose,
5+
readonly,
56
shallowReactive,
67
shallowReadonly,
78
toRefs,
@@ -26,12 +27,17 @@ type MutationResult<TData, TError, TVariables, TContext> = DistributiveOmit<
2627
'mutate' | 'reset'
2728
>
2829

30+
type UseMutationOptionsBase<TData, TError, TVariables, TContext> =
31+
MutationObserverOptions<TData, TError, TVariables, TContext> & {
32+
shallow?: boolean
33+
}
34+
2935
export type UseMutationOptions<
3036
TData = unknown,
3137
TError = DefaultError,
3238
TVariables = void,
3339
TContext = unknown,
34-
> = MaybeRefDeep<MutationObserverOptions<TData, TError, TVariables, TContext>>
40+
> = MaybeRefDeep<UseMutationOptionsBase<TData, TError, TVariables, TContext>>
3541

3642
type MutateSyncFunction<
3743
TData = unknown,
@@ -61,7 +67,7 @@ export function useMutation<
6167
TContext = unknown,
6268
>(
6369
mutationOptions: MaybeRefDeep<
64-
MutationObserverOptions<TData, TError, TVariables, TContext>
70+
UseMutationOptionsBase<TData, TError, TVariables, TContext>
6571
>,
6672
queryClient?: QueryClient,
6773
): UseMutationReturnType<TData, TError, TVariables, TContext> {
@@ -101,7 +107,14 @@ export function useMutation<
101107
unsubscribe()
102108
})
103109

104-
const resultRefs = toRefs(shallowReadonly(state)) as unknown as ToRefs<
110+
const readonlyState =
111+
process.env.NODE_ENV === 'production'
112+
? state
113+
: options.value.shallow
114+
? shallowReadonly(state)
115+
: readonly(state)
116+
117+
const resultRefs = toRefs(readonlyState) as ToRefs<
105118
Readonly<MutationResult<TData, TError, TVariables, TContext>>
106119
>
107120

packages/vue-query/src/useQueries.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
getCurrentScope,
55
onScopeDispose,
66
readonly,
7+
shallowReadonly,
78
shallowRef,
89
unref,
910
watch,
@@ -256,6 +257,7 @@ export function useQueries<
256257
}: {
257258
queries: MaybeRefDeep<UseQueriesOptionsArg<T>>
258259
combine?: (result: UseQueriesResults<T>) => TCombinedResult
260+
shallow?: boolean
259261
},
260262
queryClient?: QueryClient,
261263
): Readonly<Ref<TCombinedResult>> {
@@ -348,5 +350,9 @@ export function useQueries<
348350
unsubscribe()
349351
})
350352

351-
return readonly(state) as Readonly<Ref<TCombinedResult>>
353+
return process.env.NODE_ENV === 'production'
354+
? state
355+
: options.shallow
356+
? shallowReadonly(state)
357+
: (readonly(state) as Readonly<Ref<TCombinedResult>>)
352358
}

packages/vue-query/src/useQuery.ts

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,37 @@ export type UseQueryOptions<
2323
TData = TQueryFnData,
2424
TQueryData = TQueryFnData,
2525
TQueryKey extends QueryKey = QueryKey,
26-
> = MaybeRef<{
27-
[Property in keyof QueryObserverOptions<
28-
TQueryFnData,
29-
TError,
30-
TData,
31-
TQueryData,
32-
TQueryKey
33-
>]: Property extends 'enabled'
34-
? MaybeRefOrGetter<
35-
QueryObserverOptions<
36-
TQueryFnData,
37-
TError,
38-
TData,
39-
TQueryData,
40-
DeepUnwrapRef<TQueryKey>
41-
>[Property]
42-
>
43-
: MaybeRefDeep<
44-
QueryObserverOptions<
45-
TQueryFnData,
46-
TError,
47-
TData,
48-
TQueryData,
49-
DeepUnwrapRef<TQueryKey>
50-
>[Property]
51-
>
52-
}>
26+
> = MaybeRef<
27+
{
28+
[Property in keyof QueryObserverOptions<
29+
TQueryFnData,
30+
TError,
31+
TData,
32+
TQueryData,
33+
TQueryKey
34+
>]: Property extends 'enabled'
35+
? MaybeRefOrGetter<
36+
QueryObserverOptions<
37+
TQueryFnData,
38+
TError,
39+
TData,
40+
TQueryData,
41+
DeepUnwrapRef<TQueryKey>
42+
>[Property]
43+
>
44+
: MaybeRefDeep<
45+
QueryObserverOptions<
46+
TQueryFnData,
47+
TError,
48+
TData,
49+
TQueryData,
50+
DeepUnwrapRef<TQueryKey>
51+
>[Property]
52+
>
53+
} & {
54+
shallow?: boolean
55+
}
56+
>
5357

5458
export type UndefinedInitialQueryOptions<
5559
TQueryFnData = unknown,

0 commit comments

Comments
 (0)