Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 7 additions & 14 deletions src/core/queryObserver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export class QueryObserver<
private staleTimeoutId?: number
private refetchIntervalId?: number
private currentRefetchInterval?: number | false
private trackedProps!: Array<keyof QueryObserverResult>
private trackedProps!: Set<keyof QueryObserverResult>

constructor(
client: QueryClient,
Expand All @@ -88,7 +88,7 @@ export class QueryObserver<

this.client = client
this.options = options
this.trackedProps = []
this.trackedProps = new Set()
this.previousSelectError = null
this.bindMethods()
this.setOptions(options)
Expand Down Expand Up @@ -235,25 +235,19 @@ export class QueryObserver<
): QueryObserverResult<TData, TError> {
const trackedResult = {} as QueryObserverResult<TData, TError>

const trackProp = (key: keyof QueryObserverResult) => {
if (!this.trackedProps.includes(key)) {
this.trackedProps.push(key)
}
}

Object.keys(result).forEach(key => {
Object.defineProperty(trackedResult, key, {
configurable: false,
enumerable: true,
get: () => {
trackProp(key as keyof QueryObserverResult)
this.trackedProps.add(key as keyof QueryObserverResult)
return result[key as keyof QueryObserverResult]
},
})
})

if (defaultedOptions.useErrorBoundary) {
trackProp('error')
this.trackedProps.add('error')
}

return trackedResult
Expand Down Expand Up @@ -605,18 +599,17 @@ export class QueryObserver<

if (
notifyOnChangeProps === 'all' ||
(!notifyOnChangeProps && !this.trackedProps.length)
(!notifyOnChangeProps && !this.trackedProps.size)
) {
return true
}

const includedProps = notifyOnChangeProps ?? this.trackedProps
const includedProps = new Set(notifyOnChangeProps ?? this.trackedProps)

return Object.keys(result).some(key => {
const typedKey = key as keyof QueryObserverResult
const changed = result[typedKey] !== prevResult[typedKey]
const isIncluded = includedProps?.some(x => x === key)
return changed && (!includedProps || isIncluded)
return changed && includedProps.has(typedKey)
})
}

Expand Down
8 changes: 3 additions & 5 deletions src/core/subscribable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@ export class Subscribable<TListener extends Function = Listener> {
this.listeners = []
}

subscribe(listener?: TListener): () => void {
const callback = listener || (() => undefined)

this.listeners.push(callback as TListener)
subscribe(listener: TListener): () => void {
this.listeners.push(listener as TListener)

this.onSubscribe()

return () => {
this.listeners = this.listeners.filter(x => x !== callback)
this.listeners = this.listeners.filter(x => x !== listener)
this.onUnsubscribe()
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/core/tests/focusManager.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ describe('focusManager', () => {

const setEventListenerSpy = jest.spyOn(focusManager, 'setEventListener')

const unsubscribe = focusManager.subscribe()
const unsubscribe = focusManager.subscribe(() => undefined)
expect(setEventListenerSpy).toHaveBeenCalledTimes(0)

unsubscribe()
Expand All @@ -88,7 +88,7 @@ describe('focusManager', () => {
)

// Should set the default event listener with window event listeners
const unsubscribe = focusManager.subscribe()
const unsubscribe = focusManager.subscribe(() => undefined)
expect(addEventListenerSpy).toHaveBeenCalledTimes(2)

// Should replace the window default event listener by a new one
Expand Down
6 changes: 3 additions & 3 deletions src/core/tests/mutationCache.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ describe('mutationCache', () => {
cacheTime: 10,
mutationFn: () => Promise.resolve(),
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)

expect(queryClient.getMutationCache().getAll()).toHaveLength(0)
observer.mutate(1)
Expand Down Expand Up @@ -231,7 +231,7 @@ describe('mutationCache', () => {
},
onSuccess,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
observer.mutate(1)
unsubscribe()
expect(queryClient.getMutationCache().getAll()).toHaveLength(1)
Expand All @@ -257,7 +257,7 @@ describe('mutationCache', () => {
},
onSuccess,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
observer.mutate(1)
unsubscribe()
await waitFor(() => {
Expand Down
4 changes: 2 additions & 2 deletions src/core/tests/onlineManager.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ describe('onlineManager', () => {

const setEventListenerSpy = jest.spyOn(onlineManager, 'setEventListener')

const unsubscribe = onlineManager.subscribe()
const unsubscribe = onlineManager.subscribe(() => undefined)
expect(setEventListenerSpy).toHaveBeenCalledTimes(0)

unsubscribe()
Expand All @@ -83,7 +83,7 @@ describe('onlineManager', () => {
)

// Should set the default event listener with window event listeners
const unsubscribe = onlineManager.subscribe()
const unsubscribe = onlineManager.subscribe(() => undefined)
expect(addEventListenerSpy).toHaveBeenCalledTimes(2)

// Should replace the window default event listener by a new one
Expand Down
2 changes: 1 addition & 1 deletion src/core/tests/queriesObserver.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ describe('queriesObserver', () => {
{ queryKey: key1, queryFn: queryFn1 },
{ queryKey: key2, queryFn: queryFn2 },
])
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await sleep(1)
unsubscribe()
expect(queryFn1).toHaveBeenCalledTimes(1)
Expand Down
24 changes: 12 additions & 12 deletions src/core/tests/query.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ describe('query', () => {
queryKey: key,
enabled: false,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
unsubscribe()

await sleep(100)
Expand Down Expand Up @@ -253,7 +253,7 @@ describe('query', () => {
queryKey: key,
enabled: false,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
unsubscribe()

await sleep(100)
Expand Down Expand Up @@ -484,10 +484,10 @@ describe('query', () => {
cacheTime: 0,
staleTime: Infinity,
})
const unsubscribe1 = observer.subscribe()
const unsubscribe1 = observer.subscribe(() => undefined)
unsubscribe1()
await waitFor(() => expect(queryCache.find(key)).toBeUndefined())
const unsubscribe2 = observer.subscribe()
const unsubscribe2 = observer.subscribe(() => undefined)
unsubscribe2()

await waitFor(() => expect(queryCache.find(key)).toBeUndefined())
Expand All @@ -502,7 +502,7 @@ describe('query', () => {
cacheTime: 0,
})
expect(queryCache.find(key)).toBeDefined()
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
expect(queryCache.find(key)).toBeDefined()
unsubscribe()
await waitFor(() => expect(queryCache.find(key)).toBeUndefined())
Expand All @@ -518,7 +518,7 @@ describe('query', () => {
},
cacheTime: 10,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await sleep(20)
expect(queryCache.find(key)).toBeDefined()
observer.refetch()
Expand All @@ -539,7 +539,7 @@ describe('query', () => {
cacheTime: 0,
})
expect(queryCache.find(key)).toBeDefined()
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await sleep(100)
expect(queryCache.find(key)).toBeDefined()
unsubscribe()
Expand All @@ -560,9 +560,9 @@ describe('query', () => {

expect(query?.getObserversCount()).toEqual(0)

const unsubscribe1 = observer.subscribe()
const unsubscribe2 = observer2.subscribe()
const unsubscribe3 = observer3.subscribe()
const unsubscribe1 = observer.subscribe(() => undefined)
const unsubscribe2 = observer2.subscribe(() => undefined)
const unsubscribe3 = observer3.subscribe(() => undefined)
expect(query?.getObserversCount()).toEqual(3)

unsubscribe3()
Expand Down Expand Up @@ -658,7 +658,7 @@ describe('query', () => {
})

const refetchSpy = jest.spyOn(observer, 'refetch')
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
queryCache.onOnline()

// Should refetch the observer
Expand Down Expand Up @@ -821,7 +821,7 @@ describe('query', () => {
retry: false,
})

const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await sleep(10)
expect(consoleMock).toHaveBeenCalledWith('Missing queryFn')

Expand Down
36 changes: 18 additions & 18 deletions src/core/tests/queryClient.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -722,8 +722,8 @@ describe('queryClient', () => {
queryKey: key1,
enabled: false,
})
observer1.subscribe()
observer2.subscribe()
observer1.subscribe(() => undefined)
observer2.subscribe(() => undefined)
await queryClient.refetchQueries()
observer1.destroy()
observer2.destroy()
Expand All @@ -743,7 +743,7 @@ describe('queryClient', () => {
queryFn: queryFn1,
staleTime: Infinity,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await queryClient.refetchQueries({ type: 'active', stale: false })
unsubscribe()
expect(queryFn1).toHaveBeenCalledTimes(2)
Expand All @@ -761,7 +761,7 @@ describe('queryClient', () => {
queryKey: key1,
queryFn: queryFn1,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
queryClient.invalidateQueries(key1)
await queryClient.refetchQueries({ stale: true })
unsubscribe()
Expand All @@ -782,7 +782,7 @@ describe('queryClient', () => {
queryKey: key1,
queryFn: queryFn1,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await queryClient.refetchQueries(
{ type: 'active', stale: true },
{ cancelRefetch: false }
Expand All @@ -804,7 +804,7 @@ describe('queryClient', () => {
queryFn: queryFn1,
staleTime: Infinity,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await queryClient.refetchQueries()
unsubscribe()
expect(queryFn1).toHaveBeenCalledTimes(2)
Expand All @@ -823,7 +823,7 @@ describe('queryClient', () => {
queryFn: queryFn1,
staleTime: Infinity,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await queryClient.refetchQueries({ type: 'all' })
unsubscribe()
expect(queryFn1).toHaveBeenCalledTimes(2)
Expand All @@ -842,7 +842,7 @@ describe('queryClient', () => {
queryFn: queryFn1,
staleTime: Infinity,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await queryClient.refetchQueries({ type: 'active' })
unsubscribe()
expect(queryFn1).toHaveBeenCalledTimes(2)
Expand All @@ -861,7 +861,7 @@ describe('queryClient', () => {
queryFn: queryFn1,
staleTime: Infinity,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
await queryClient.refetchQueries({ type: 'inactive' })
unsubscribe()
expect(queryFn1).toHaveBeenCalledTimes(1)
Expand Down Expand Up @@ -906,7 +906,7 @@ describe('queryClient', () => {
queryFn: queryFn1,
staleTime: Infinity,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
queryClient.invalidateQueries(key1)
unsubscribe()
expect(queryFn1).toHaveBeenCalledTimes(2)
Expand All @@ -925,7 +925,7 @@ describe('queryClient', () => {
enabled: false,
staleTime: Infinity,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
queryClient.invalidateQueries(key1)
unsubscribe()
expect(queryFn1).toHaveBeenCalledTimes(1)
Expand All @@ -944,7 +944,7 @@ describe('queryClient', () => {
queryFn: queryFn1,
staleTime: Infinity,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
queryClient.invalidateQueries(key1, {
refetchType: 'none',
})
Expand All @@ -966,7 +966,7 @@ describe('queryClient', () => {
staleTime: Infinity,
enabled: false,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
queryClient.invalidateQueries(key1, {
refetchType: 'inactive',
})
Expand All @@ -987,7 +987,7 @@ describe('queryClient', () => {
queryFn: queryFn1,
staleTime: Infinity,
})
const unsubscribe = observer.subscribe()
const unsubscribe = observer.subscribe(() => undefined)
queryClient.invalidateQueries({
refetchType: 'all',
})
Expand All @@ -1005,7 +1005,7 @@ describe('queryClient', () => {
enabled: false,
initialData: 1,
})
observer.subscribe()
observer.subscribe(() => undefined)

queryClient.fetchQuery(key, ({ signal }) => {
const promise = new Promise(resolve => {
Expand Down Expand Up @@ -1036,7 +1036,7 @@ describe('queryClient', () => {
enabled: false,
initialData: 1,
})
observer.subscribe()
observer.subscribe(() => undefined)

queryClient.fetchQuery(key, ({ signal }) => {
const promise = new Promise(resolve => {
Expand Down Expand Up @@ -1125,8 +1125,8 @@ describe('queryClient', () => {
queryFn: queryFn2,
enabled: false,
})
observer1.subscribe()
observer2.subscribe()
observer1.subscribe(() => undefined)
observer2.subscribe(() => undefined)
await queryClient.resetQueries()
observer2.destroy()
observer1.destroy()
Expand Down
Loading