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
17,072 changes: 53 additions & 17,019 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "@sveltestack/svelte-query",
"homepage": "https://github.com/SvelteStack/svelte-query",
"private": false,
"version": "1.5.0",
"version": "1.6.0",
"description": "Hooks for managing, caching and syncing asynchronous and remote data in Svelte",
"license": "MIT",
"svelte": "svelte/index.js",
Expand Down Expand Up @@ -82,7 +82,7 @@
"svelte-jester": "^1.0.5",
"svelte2tsx": "^0.4.8",
"ts-jest": "^26.5.4",
"type-fest": "^0.21.1",
"type-fest": "^2.10.0",
"typescript": "^4.0.3"
},
"peerDependencies": {
Expand Down
6 changes: 3 additions & 3 deletions src/infiniteQuery/useInfiniteQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export function useInfiniteQuery<
TQueryKey extends QueryKey = QueryKey
>(
queryKey: TQueryKey,
options?: UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>
options?: Omit<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>, 'queryKey'>
): UseInfiniteQueryStoreResult<TQueryFnData, TError, TData, TQueryKey>
export function useInfiniteQuery<
TQueryFnData = unknown,
Expand All @@ -33,7 +33,7 @@ export function useInfiniteQuery<
>(
queryKey: TQueryKey,
queryFn: QueryFunction<TQueryFnData, TQueryKey>,
options?: UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>
options?: Omit<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>, 'queryKey' | 'queryFn'>
): UseInfiniteQueryStoreResult<TQueryFnData, TError, TData, TQueryKey>
export default function useInfiniteQuery<TQueryFnData, TError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(
arg1: TQueryKey | UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>,
Expand Down Expand Up @@ -78,7 +78,7 @@ export default function useInfiniteQuery<TQueryFnData, TError, TData = TQueryFnD
let defaultedOptions = client.defaultQueryObserverOptions(options)
// Include callbacks in batch renders
defaultedOptions = setBatchCalls<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>>(defaultedOptions)
observer.setOptions(defaultedOptions)
observer.setOptions(defaultedOptions, { listeners: false })
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/mutation/useMutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export function useMutation<
TContext = unknown
>(
mutationFn: MutationFunction<TData, TVariables>,
options?: UseMutationOptions<TData, TError, TVariables, TContext>
options?: Omit<UseMutationOptions<TData, TError, TVariables, TContext>, 'mutationFn'>
): MutationStoreResult<TData, TError, TVariables, TContext>
export function useMutation<
TData = unknown,
Expand All @@ -37,7 +37,7 @@ export function useMutation<
TContext = unknown
>(
mutationKey: MutationKey,
options?: UseMutationOptions<TData, TError, TVariables, TContext>
options?: Omit<UseMutationOptions<TData, TError, TVariables, TContext>, 'mutationKey'>
): MutationStoreResult<TData, TError, TVariables, TContext>
export function useMutation<
TData = unknown,
Expand All @@ -47,7 +47,7 @@ export function useMutation<
>(
mutationKey: MutationKey,
mutationFn?: MutationFunction<TData, TVariables>,
options?: UseMutationOptions<TData, TError, TVariables, TContext>
options?: Omit<UseMutationOptions<TData, TError, TVariables, TContext>, 'mutationKey' | 'mutationFn'>
): MutationStoreResult<TData, TError, TVariables, TContext>
export default function useMutation<
TData = unknown,
Expand Down
50 changes: 25 additions & 25 deletions src/queries/useQueries.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
import { readable } from 'svelte/store';

import { notifyManager, QueriesObserver, QueryClient, QueryKey } from "../queryCore/core";
import { notifyManager, QueriesObserver, QueryClient } from "../queryCore/core";
import { useQueryClient } from "../queryClientProvider";
import type { UseQueryOptions, UseQueriesStoreResult } from "../types";

export default function useQueries<
TQueryFnData = unknown,
TError = unknown,
TData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey
>(queries: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>[]): UseQueriesStoreResult<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>[]>;
export default function useQueries<
TQueryFnData = unknown,
TError = unknown,
TData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey
>(queries: []): UseQueriesStoreResult<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>[]>;
export default function useQueries<
T extends readonly [...UseQueryOptions[]]
>(queries: T): UseQueriesStoreResult<T>;
export default function useQueries<
T extends readonly [...UseQueryOptions[]]
>(queries: T): UseQueriesStoreResult<T> {
import type { UseQueriesStoreResult, QueriesOptions, QueriesResults } from "../types";

export default function useQueries<T extends any[]>(
queries: readonly [...QueriesOptions<T>]
): UseQueriesStoreResult<T> {
const client: QueryClient = useQueryClient();
const observer = new QueriesObserver(client, queries);

const { subscribe } = readable(observer.getCurrentResult(), (set) => {
function getDefaultQuery(newQueries: readonly [...QueriesOptions<T>]) {
return newQueries.map(options => {
const defaultedOptions = client.defaultQueryObserverOptions(
options
)
// Make sure the results are already in fetching state before subscribing or updating options
defaultedOptions.optimisticResults = true

return defaultedOptions
})
}

const defaultedQueries = getDefaultQuery(queries)
const observer = new QueriesObserver(client, defaultedQueries);

const { subscribe } = readable((observer.getCurrentResult() as QueriesResults<T>), (set) => {
return observer.subscribe(notifyManager.batchCalls(set));
});

const setQueries = (newQueries: T) => {
const setQueries = (newQueries: readonly [...QueriesOptions<T>]) => {
if (observer.hasListeners()) {
observer.setQueries(newQueries)
const defaultedNewQueries = getDefaultQuery(newQueries)
observer.setQueries(defaultedNewQueries, { listeners: false })
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/query/useQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export function useQuery<
TError = unknown,
TData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey
>(queryKey: TQueryKey, options?: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>): UseQueryStoreResult<TQueryFnData, TError, TData, TQueryKey>
>(queryKey: TQueryKey, options?: Omit<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey'>): UseQueryStoreResult<TQueryFnData, TError, TData, TQueryKey>
export function useQuery<
TQueryFnData = unknown,
TError = unknown,
Expand All @@ -28,7 +28,7 @@ export function useQuery<
>(
queryKey: TQueryKey,
queryFn: QueryFunction<TQueryFnData, TQueryKey>,
options?: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>
options?: Omit<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey' | 'queryFn'>
): UseQueryStoreResult<TQueryFnData, TError, TData, TQueryKey>
export default function useQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(
arg1: TQueryKey | UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
Expand Down Expand Up @@ -74,7 +74,7 @@ export default function useQuery<TQueryFnData = unknown, TError = unknown, TData
// Include callbacks in batch renders
defaultedOptions = setBatchCalls<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>>(defaultedOptions)
if (observer.hasListeners()) {
observer.setOptions(defaultedOptions)
observer.setOptions(defaultedOptions, { listeners: false })
}
}

Expand Down
7 changes: 3 additions & 4 deletions src/queryCore/broadcastQueryClient-experimental/index.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
import { BroadcastChannel } from 'broadcast-channel'
import { QueryClient } from '../core'

interface BroadcastQueryClientOptions {
queryClient: QueryClient
broadcastChannel: string
broadcastChannel?: string
}

export async function broadcastQueryClient({
export function broadcastQueryClient({
queryClient,
broadcastChannel = 'svelte-query',
}: BroadcastQueryClientOptions) {
const { BroadcastChannel } = await import('broadcast-channel')

let transaction = false
const tx = (cb: () => void) => {
transaction = true
Expand Down
64 changes: 38 additions & 26 deletions src/queryCore/core/focusManager.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,51 @@
import { Subscribable } from './subscribable'
import { isServer } from './utils'

class FocusManager extends Subscribable {
type SetupFn = (
setFocused: (focused?: boolean) => void
) => (() => void) | undefined

export class FocusManager extends Subscribable {
private focused?: boolean
private removeEventListener?: () => void
private cleanup?: () => void

private setup: SetupFn

constructor() {
super()
this.setup = onFocus => {
if (!isServer && window?.addEventListener) {
const listener = () => onFocus()
// Listen to visibillitychange and focus
window.addEventListener('visibilitychange', listener, false)
window.addEventListener('focus', listener, false)

return () => {
// Be sure to unsubscribe if a new handler is set
window.removeEventListener('visibilitychange', listener)
window.removeEventListener('focus', listener)
}
}
}
}

protected onSubscribe(): void {
if (!this.removeEventListener) {
this.setDefaultEventListener()
if (!this.cleanup) {
this.setEventListener(this.setup)
}
}

setEventListener(
setup: (onFocus: () => void) => (focused?: boolean) => void
): void {
if (this.removeEventListener) {
this.removeEventListener()
protected onUnsubscribe() {
if (!this.hasListeners()) {
this.cleanup?.()
this.cleanup = undefined
}
this.removeEventListener = setup((focused?: boolean) => {
}

setEventListener(setup: SetupFn): void {
this.setup = setup
this.cleanup?.()
this.cleanup = setup(focused => {
if (typeof focused === 'boolean') {
this.setFocused(focused)
} else {
Expand Down Expand Up @@ -54,22 +82,6 @@ class FocusManager extends Subscribable {
document.visibilityState
)
}

private setDefaultEventListener() {
if (!isServer && window?.addEventListener) {
this.setEventListener(onFocus => {
// Listen to visibillitychange and focus
window.addEventListener('visibilitychange', onFocus, false)
window.addEventListener('focus', onFocus, false)

return () => {
// Be sure to unsubscribe if a new handler is set
window.removeEventListener('visibilitychange', onFocus)
window.removeEventListener('focus', onFocus)
}
})
}
}
}

export const focusManager = new FocusManager()
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import type { QueryClient } from '../core/queryClient'
import type { Query, QueryState } from '../core/query'
import type { QueryClient } from './queryClient'
import type { Query, QueryState } from './query'
import type {
MutationKey,
MutationOptions,
QueryKey,
QueryOptions,
} from '../core/types'
import type { Mutation, MutationState } from '../core/mutation'
} from './types'
import type { Mutation, MutationState } from './mutation'

// TYPES

Expand Down
11 changes: 10 additions & 1 deletion src/queryCore/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,17 @@ export { focusManager } from './focusManager'
export { onlineManager } from './onlineManager'
export { hashQueryKey, isError } from './utils'
export { isCancelledError } from './retryer'
export { dehydrate, hydrate } from './hydration'

// Types
export * from './types'
export type { Query as QueryCore } from './query'
export type { Query as QueryCore} from './query'
export type { Mutation as MutationCore} from './mutation'
export type { Logger } from './logger'
export type {
DehydrateOptions,
DehydratedState,
HydrateOptions,
ShouldDehydrateMutationFunction,
ShouldDehydrateQueryFunction,
} from './hydration'
Loading