From d92304a445f962ace045c301fef2d89f6313b573 Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Sun, 21 May 2023 10:21:33 +1000 Subject: [PATCH 1/7] Simplify types --- .../src/__tests__/CreateQuery.svelte | 4 +- .../src/__tests__/createQuery.test.ts | 4 +- packages/svelte-query/src/createBaseQuery.ts | 14 ++-- .../svelte-query/src/createInfiniteQuery.ts | 17 ++--- packages/svelte-query/src/createMutation.ts | 5 +- packages/svelte-query/src/createQuery.ts | 13 +--- packages/svelte-query/src/types.ts | 75 ++++++++++--------- 7 files changed, 61 insertions(+), 71 deletions(-) diff --git a/packages/svelte-query/src/__tests__/CreateQuery.svelte b/packages/svelte-query/src/__tests__/CreateQuery.svelte index d64347258f..c702c66814 100644 --- a/packages/svelte-query/src/__tests__/CreateQuery.svelte +++ b/packages/svelte-query/src/__tests__/CreateQuery.svelte @@ -2,9 +2,9 @@ import { QueryClient } from '@tanstack/query-core' import { setQueryClientContext } from '../context' import { createQuery } from '../createQuery' - import type { CreateQueryOptions, WritableOrVal } from '../types' + import type { CreateQueryOptions } from '../types' - export let options: WritableOrVal> + export let options: CreateQueryOptions const queryClient = new QueryClient() setQueryClientContext(queryClient) diff --git a/packages/svelte-query/src/__tests__/createQuery.test.ts b/packages/svelte-query/src/__tests__/createQuery.test.ts index 0537f2a82c..47460e3d06 100644 --- a/packages/svelte-query/src/__tests__/createQuery.test.ts +++ b/packages/svelte-query/src/__tests__/createQuery.test.ts @@ -3,7 +3,7 @@ import { render, waitFor } from '@testing-library/svelte' import { writable } from 'svelte/store' import CreateQuery from './CreateQuery.svelte' import { sleep } from './utils' -import type { CreateQueryOptions, WritableOrVal } from '../types' +import type { CreateQueryOptions } from '../types' describe('createQuery', () => { it('Render and wait for success', async () => { @@ -29,7 +29,7 @@ describe('createQuery', () => { }) it('should keep previous data when returned as placeholder data', async () => { - const options: WritableOrVal = writable({ + const options: CreateQueryOptions = writable({ queryKey: ['test', [1]], queryFn: async ({ queryKey }) => { await sleep(10) diff --git a/packages/svelte-query/src/createBaseQuery.ts b/packages/svelte-query/src/createBaseQuery.ts index 430e2efb31..46130a002a 100644 --- a/packages/svelte-query/src/createBaseQuery.ts +++ b/packages/svelte-query/src/createBaseQuery.ts @@ -1,10 +1,6 @@ import type { QueryClient, QueryKey, QueryObserver } from '@tanstack/query-core' import { notifyManager } from '@tanstack/query-core' -import type { - CreateBaseQueryOptions, - CreateBaseQueryResult, - WritableOrVal, -} from './types' +import type { CreateBaseQueryOptions, CreateBaseQueryResult } from './types' import { useQueryClient } from './useQueryClient' import { derived, get, readable, writable } from 'svelte/store' import { isWritable } from './utils' @@ -16,8 +12,12 @@ export function createBaseQuery< TQueryData, TQueryKey extends QueryKey, >( - options: WritableOrVal< - CreateBaseQueryOptions + options: CreateBaseQueryOptions< + TQueryFnData, + TError, + TData, + TQueryData, + TQueryKey >, Observer: typeof QueryObserver, queryClient?: QueryClient, diff --git a/packages/svelte-query/src/createInfiniteQuery.ts b/packages/svelte-query/src/createInfiniteQuery.ts index 46f33e7eb3..78df0ec427 100644 --- a/packages/svelte-query/src/createInfiniteQuery.ts +++ b/packages/svelte-query/src/createInfiniteQuery.ts @@ -9,7 +9,6 @@ import { InfiniteQueryObserver } from '@tanstack/query-core' import type { CreateInfiniteQueryOptions, CreateInfiniteQueryResult, - WritableOrVal, } from './types' import { createBaseQuery } from './createBaseQuery' @@ -20,15 +19,13 @@ export function createInfiniteQuery< TQueryKey extends QueryKey = QueryKey, TPageParam = unknown, >( - options: WritableOrVal< - CreateInfiniteQueryOptions< - TQueryFnData, - TError, - TData, - TQueryFnData, - TQueryKey, - TPageParam - > + options: CreateInfiniteQueryOptions< + TQueryFnData, + TError, + TData, + TQueryFnData, + TQueryKey, + TPageParam >, queryClient?: QueryClient, ): CreateInfiniteQueryResult { diff --git a/packages/svelte-query/src/createMutation.ts b/packages/svelte-query/src/createMutation.ts index b9c37d3a91..58004ea29a 100644 --- a/packages/svelte-query/src/createMutation.ts +++ b/packages/svelte-query/src/createMutation.ts @@ -5,7 +5,6 @@ import type { CreateMutateFunction, CreateMutationOptions, CreateMutationResult, - WritableOrVal, } from './types' import { useQueryClient } from './useQueryClient' import { isWritable } from './utils' @@ -16,9 +15,7 @@ export function createMutation< TVariables = void, TContext = unknown, >( - options: WritableOrVal< - CreateMutationOptions - >, + options: CreateMutationOptions, queryClient?: QueryClient, ): CreateMutationResult { const client = useQueryClient(queryClient) diff --git a/packages/svelte-query/src/createQuery.ts b/packages/svelte-query/src/createQuery.ts index 3851214623..ba12a3764d 100644 --- a/packages/svelte-query/src/createQuery.ts +++ b/packages/svelte-query/src/createQuery.ts @@ -5,7 +5,6 @@ import type { DefinedCreateQueryResult, CreateQueryOptions, CreateQueryResult, - WritableOrVal, } from './types' type UndefinedInitialDataOptions< @@ -32,9 +31,7 @@ export function createQuery< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( - options: WritableOrVal< - UndefinedInitialDataOptions - >, + options: UndefinedInitialDataOptions, queryClient?: QueryClient, ): CreateQueryResult @@ -44,9 +41,7 @@ export function createQuery< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( - options: WritableOrVal< - DefinedInitialDataOptions - >, + options: DefinedInitialDataOptions, queryClient?: QueryClient, ): DefinedCreateQueryResult @@ -56,9 +51,7 @@ export function createQuery< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( - options: WritableOrVal< - CreateQueryOptions - >, + options: CreateQueryOptions, queryClient?: QueryClient, ) { return createBaseQuery(options, QueryObserver, queryClient) diff --git a/packages/svelte-query/src/types.ts b/packages/svelte-query/src/types.ts index f8ca30b8fe..39a058586e 100644 --- a/packages/svelte-query/src/types.ts +++ b/packages/svelte-query/src/types.ts @@ -10,87 +10,91 @@ import type { DefinedQueryObserverResult, DefaultError, } from '@tanstack/query-core' -import type { QueryClient } from '@tanstack/query-core' import type { Readable, Writable } from 'svelte/store' +/** Allows a type to be either the base object or a store of that object */ export type WritableOrVal = T | Writable -export interface ContextOptions { - /** - * Use this to pass your Svelte Query context. Otherwise, `defaultContext` will be used. - */ - context?: QueryClient | undefined -} - -export interface CreateBaseQueryOptions< +/** Options for createBaseQuery */ +export type CreateBaseQueryOptions< TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, -> extends ContextOptions, - QueryObserverOptions {} +> = WritableOrVal< + QueryObserverOptions +> -export interface CreateBaseQueryResult - extends Readable> {} +/** Result from createBaseQuery */ +export type CreateBaseQueryResult< + TData = unknown, + TError = DefaultError, +> = Readable> -export interface CreateQueryOptions< +/** Options for createQuery */ +export type CreateQueryOptions< TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, -> extends CreateBaseQueryOptions< - TQueryFnData, - TError, - TData, - TQueryFnData, - TQueryKey - > {} +> = CreateBaseQueryOptions -export interface CreateQueryResult - extends CreateBaseQueryResult {} +/** Result from createQuery */ +export type CreateQueryResult< + TData = unknown, + TError = DefaultError, +> = CreateBaseQueryResult -export interface CreateInfiniteQueryOptions< +/** Options for createInfiniteQuery */ +export type CreateInfiniteQueryOptions< TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown, -> extends InfiniteQueryObserverOptions< +> = WritableOrVal< + InfiniteQueryObserverOptions< TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam - > {} + > +> +/** Result from createInfiniteQuery */ export type CreateInfiniteQueryResult< TData = unknown, TError = DefaultError, > = Readable> +/** Options for createBaseQuery with initialData */ export type DefinedCreateBaseQueryResult< TData = unknown, TError = DefaultError, > = Readable> +/** Options for createQuery with initialData */ export type DefinedCreateQueryResult< TData = unknown, TError = DefaultError, > = DefinedCreateBaseQueryResult -export interface CreateMutationOptions< +/** Options for createMutation */ +export type CreateMutationOptions< TData = unknown, TError = DefaultError, TVariables = void, TContext = unknown, -> extends ContextOptions, - Omit< - MutationObserverOptions, - '_defaulted' | 'variables' - > {} +> = WritableOrVal< + Omit< + MutationObserverOptions, + '_defaulted' | 'variables' + > +> export type CreateMutateFunction< TData = unknown, @@ -120,13 +124,12 @@ export type CreateBaseMutationResult< mutateAsync: CreateMutateAsyncFunction } -export interface CreateMutationResult< +/** Result from createMutation */ +export type CreateMutationResult< TData = unknown, TError = DefaultError, TVariables = unknown, TContext = unknown, -> extends Readable< - CreateBaseMutationResult - > {} +> = Readable> type Override = { [K in keyof A]: K extends keyof B ? B[K] : A[K] } From 63153868cc3e0c317536e9420418de34eb835014 Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Sun, 21 May 2023 10:50:34 +1000 Subject: [PATCH 2/7] Use QueryObserverOptions --- packages/svelte-query/src/createQueries.ts | 35 +++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/packages/svelte-query/src/createQueries.ts b/packages/svelte-query/src/createQueries.ts index ac5e0de48c..01b59fb2f7 100644 --- a/packages/svelte-query/src/createQueries.ts +++ b/packages/svelte-query/src/createQueries.ts @@ -6,24 +6,25 @@ import type { QueryObserverResult, DefaultError, QueriesObserverOptions, + QueryObserverOptions, } from '@tanstack/query-core' import { notifyManager, QueriesObserver } from '@tanstack/query-core' import { derived, get, readable, writable, type Readable } from 'svelte/store' -import type { CreateQueryOptions, WritableOrVal } from './types' +import type { WritableOrVal } from './types' import { useQueryClient } from './useQueryClient' import { isWritable } from './utils' // This defines the `CreateQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`. // `placeholderData` function does not have a parameter -type CreateQueryOptionsForCreateQueries< +type QueryObserverOptionsForCreateQueries< TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, > = Omit< - CreateQueryOptions, + QueryObserverOptions, 'placeholderData' > & { placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction @@ -39,33 +40,33 @@ type GetOptions = error?: infer TError data: infer TData } - ? CreateQueryOptionsForCreateQueries + ? QueryObserverOptionsForCreateQueries : T extends { queryFnData: infer TQueryFnData; error?: infer TError } - ? CreateQueryOptionsForCreateQueries + ? QueryObserverOptionsForCreateQueries : T extends { data: infer TData; error?: infer TError } - ? CreateQueryOptionsForCreateQueries + ? QueryObserverOptionsForCreateQueries : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData] T extends [infer TQueryFnData, infer TError, infer TData] - ? CreateQueryOptionsForCreateQueries + ? QueryObserverOptionsForCreateQueries : T extends [infer TQueryFnData, infer TError] - ? CreateQueryOptionsForCreateQueries + ? QueryObserverOptionsForCreateQueries : T extends [infer TQueryFnData] - ? CreateQueryOptionsForCreateQueries + ? QueryObserverOptionsForCreateQueries : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided T extends { queryFn?: QueryFunction select: (data: any) => infer TData } - ? CreateQueryOptionsForCreateQueries + ? QueryObserverOptionsForCreateQueries : T extends { queryFn?: QueryFunction } - ? CreateQueryOptionsForCreateQueries< + ? QueryObserverOptionsForCreateQueries< TQueryFnData, Error, TQueryFnData, TQueryKey > : // Fallback - CreateQueryOptionsForCreateQueries + QueryObserverOptionsForCreateQueries type GetResults = // Part 1: responsible for mapping explicit type parameter to function result, if object @@ -101,7 +102,7 @@ export type QueriesOptions< Result extends any[] = [], Depth extends ReadonlyArray = [], > = Depth['length'] extends MAXIMUM_DEPTH - ? CreateQueryOptionsForCreateQueries[] + ? QueryObserverOptionsForCreateQueries[] : T extends [] ? [] : T extends [infer Head] @@ -112,15 +113,15 @@ export type QueriesOptions< ? T : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! // use this to infer the param types in the case of Array.map() argument - T extends CreateQueryOptionsForCreateQueries< + T extends QueryObserverOptionsForCreateQueries< infer TQueryFnData, infer TError, infer TData, infer TQueryKey >[] - ? CreateQueryOptionsForCreateQueries[] + ? QueryObserverOptionsForCreateQueries[] : // Fallback - CreateQueryOptionsForCreateQueries[] + QueryObserverOptionsForCreateQueries[] /** * QueriesResults reducer recursively maps type param to results @@ -137,7 +138,7 @@ export type QueriesResults< ? [...Result, GetResults] : T extends [infer Head, ...infer Tail] ? QueriesResults<[...Tail], [...Result, GetResults], [...Depth, 1]> - : T extends CreateQueryOptionsForCreateQueries< + : T extends QueryObserverOptionsForCreateQueries< infer TQueryFnData, infer TError, infer TData, From 60f7dd65c7fba7dbb109e438d2164d44f99c1165 Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Sun, 21 May 2023 11:00:48 +1000 Subject: [PATCH 3/7] Run prettier --- packages/svelte-query/src/createQueries.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/svelte-query/src/createQueries.ts b/packages/svelte-query/src/createQueries.ts index 01b59fb2f7..95e384414d 100644 --- a/packages/svelte-query/src/createQueries.ts +++ b/packages/svelte-query/src/createQueries.ts @@ -57,7 +57,12 @@ type GetOptions = queryFn?: QueryFunction select: (data: any) => infer TData } - ? QueryObserverOptionsForCreateQueries + ? QueryObserverOptionsForCreateQueries< + TQueryFnData, + Error, + TData, + TQueryKey + > : T extends { queryFn?: QueryFunction } ? QueryObserverOptionsForCreateQueries< TQueryFnData, @@ -119,7 +124,12 @@ export type QueriesOptions< infer TData, infer TQueryKey >[] - ? QueryObserverOptionsForCreateQueries[] + ? QueryObserverOptionsForCreateQueries< + TQueryFnData, + TError, + TData, + TQueryKey + >[] : // Fallback QueryObserverOptionsForCreateQueries[] From d55c4ad64d06e02a6da05d4ecfd792a24db1e235 Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Sun, 21 May 2023 11:21:15 +1000 Subject: [PATCH 4/7] Fix QueryObserverOptions generics --- packages/svelte-query/src/createQueries.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte-query/src/createQueries.ts b/packages/svelte-query/src/createQueries.ts index 95e384414d..d54cb265fc 100644 --- a/packages/svelte-query/src/createQueries.ts +++ b/packages/svelte-query/src/createQueries.ts @@ -24,7 +24,7 @@ type QueryObserverOptionsForCreateQueries< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, > = Omit< - QueryObserverOptions, + QueryObserverOptions, 'placeholderData' > & { placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction From 2c421a0f713b7e5288970dcbbacf59dade6c8c3d Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Sun, 21 May 2023 11:29:59 +1000 Subject: [PATCH 5/7] Update tsconfig.json --- packages/svelte-query/tsconfig.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/svelte-query/tsconfig.json b/packages/svelte-query/tsconfig.json index 54793c3205..9da3441935 100644 --- a/packages/svelte-query/tsconfig.json +++ b/packages/svelte-query/tsconfig.json @@ -3,11 +3,10 @@ "allowJs": true, "allowSyntheticDefaultImports": true, "checkJs": true, + "composite": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "importsNotUsedAsValues": "error", "isolatedModules": true, - "preserveValueImports": true, "lib": ["esnext", "DOM", "DOM.Iterable"], "moduleResolution": "node", "module": "esnext", From b476b9b6fb82b314cb4ed65baa647157c454e54d Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Sun, 21 May 2023 11:30:58 +1000 Subject: [PATCH 6/7] Fix warning in svelte-query-devtools --- packages/svelte-query-devtools/tsconfig.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/svelte-query-devtools/tsconfig.json b/packages/svelte-query-devtools/tsconfig.json index c01e67b85f..3c977f8b43 100644 --- a/packages/svelte-query-devtools/tsconfig.json +++ b/packages/svelte-query-devtools/tsconfig.json @@ -3,11 +3,10 @@ "allowJs": true, "allowSyntheticDefaultImports": true, "checkJs": true, + "composite": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "importsNotUsedAsValues": "error", "isolatedModules": true, - "preserveValueImports": true, "lib": ["esnext", "DOM", "DOM.Iterable"], "moduleResolution": "node", "module": "esnext", From 3636b083837187c2c6d51e9140adcbec6b8b2838 Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Sun, 21 May 2023 11:36:29 +1000 Subject: [PATCH 7/7] Remove composite --- packages/svelte-query-devtools/tsconfig.json | 4 +--- packages/svelte-query/tsconfig.json | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/svelte-query-devtools/tsconfig.json b/packages/svelte-query-devtools/tsconfig.json index 3c977f8b43..54936037f3 100644 --- a/packages/svelte-query-devtools/tsconfig.json +++ b/packages/svelte-query-devtools/tsconfig.json @@ -3,7 +3,6 @@ "allowJs": true, "allowSyntheticDefaultImports": true, "checkJs": true, - "composite": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, @@ -22,8 +21,7 @@ "sourceMap": true, "strict": true, "strictNullChecks": true, - "target": "esnext", - "tsBuildInfoFile": "./build/.tsbuildinfo" + "target": "esnext" }, "include": ["src/**/*.js", "src/**/*.ts", "src/**/*.svelte", ".eslintrc.cjs", "vite.config.ts"] } diff --git a/packages/svelte-query/tsconfig.json b/packages/svelte-query/tsconfig.json index 9da3441935..e1f81ad88f 100644 --- a/packages/svelte-query/tsconfig.json +++ b/packages/svelte-query/tsconfig.json @@ -3,7 +3,6 @@ "allowJs": true, "allowSyntheticDefaultImports": true, "checkJs": true, - "composite": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, @@ -23,7 +22,6 @@ "strict": true, "strictNullChecks": true, "target": "esnext", - "tsBuildInfoFile": "./build/.tsbuildinfo", "types": ["vitest/globals", "@testing-library/jest-dom"] }, "include": ["src/**/*.js", "src/**/*.ts", "src/**/*.svelte", ".eslintrc.cjs", "vite.config.ts"]