-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
Copy pathvueQueryPlugin.ts
105 lines (88 loc) · 2.77 KB
/
vueQueryPlugin.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import { isVue2 } from 'vue-demi'
import { isServer } from '@tanstack/query-core'
import { QueryClient } from './queryClient'
import { getClientKey } from './utils'
import { setupDevtools } from './devtools/devtools'
import type { QueryClientConfig } from './types'
type ClientPersister = (client: QueryClient) => [() => void, Promise<void>]
interface CommonOptions {
enableDevtoolsV6Plugin?: boolean
queryClientKey?: string
clientPersister?: ClientPersister
clientPersisterOnSuccess?: (client: QueryClient) => void
}
interface ConfigOptions extends CommonOptions {
queryClientConfig?: QueryClientConfig
}
interface ClientOptions extends CommonOptions {
queryClient?: QueryClient
}
export type VueQueryPluginOptions = ConfigOptions | ClientOptions
export const VueQueryPlugin = {
install: (app: any, options: VueQueryPluginOptions = {}) => {
const clientKey = getClientKey(options.queryClientKey)
let client: QueryClient
if ('queryClient' in options && options.queryClient) {
client = options.queryClient
} else {
const clientConfig =
'queryClientConfig' in options ? options.queryClientConfig : undefined
client = new QueryClient(clientConfig)
}
if (!isServer) {
client.mount()
}
let persisterUnmount = () => {
// noop
}
if (options.clientPersister) {
client.isRestoring.value = true
const [unmount, promise] = options.clientPersister(client)
persisterUnmount = unmount
promise.then(() => {
client.isRestoring.value = false
options.clientPersisterOnSuccess?.(client)
})
}
const cleanup = () => {
client.unmount()
persisterUnmount()
}
if (app.onUnmount) {
app.onUnmount(cleanup)
} else {
const originalUnmount = app.unmount
app.unmount = function vueQueryUnmount() {
cleanup()
originalUnmount()
}
}
if (isVue2) {
app.mixin({
beforeCreate() {
// HACK: taken from provide(): https://github.com/vuejs/composition-api/blob/master/src/apis/inject.ts#L30
if (!this._provided) {
const provideCache = {}
Object.defineProperty(this, '_provided', {
get: () => provideCache,
set: (v) => Object.assign(provideCache, v),
})
}
this._provided[clientKey] = client
if (process.env.NODE_ENV === 'development') {
if (this === this.$root && options.enableDevtoolsV6Plugin) {
setupDevtools(this, client)
}
}
},
})
} else {
app.provide(clientKey, client)
if (process.env.NODE_ENV === 'development') {
if (options.enableDevtoolsV6Plugin) {
setupDevtools(app, client)
}
}
}
},
}