Skip to content

Commit

Permalink
Improve GraphQL input typings (#1057)
Browse files Browse the repository at this point in the history
  • Loading branch information
devunt committed Apr 19, 2023
1 parent 05d2632 commit 361e2b5
Show file tree
Hide file tree
Showing 25 changed files with 118 additions and 73 deletions.
7 changes: 7 additions & 0 deletions .changeset/pink-coins-ring.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'houdini-svelte': patch
'houdini-react': patch
'houdini': patch
---

Improved typings
5 changes: 3 additions & 2 deletions packages/houdini-react/src/runtime/hooks/useDocumentHandle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { cursorHandlers, offsetHandlers } from '$houdini/runtime/lib/pagination'
import { ArtifactKind } from '$houdini/runtime/lib/types'
import type {
GraphQLObject,
GraphQLVariables,
CursorHandlers,
OffsetHandlers,
PageInfo,
Expand All @@ -17,7 +18,7 @@ import React from 'react'
export function useDocumentHandle<
_Artifact extends QueryArtifact,
_Data extends GraphQLObject,
_Input extends Record<string, any>
_Input extends GraphQLVariables
>({
artifact,
observer,
Expand Down Expand Up @@ -134,7 +135,7 @@ export function useDocumentHandle<
export type DocumentHandle<
_Artifact extends QueryArtifact,
_Data extends GraphQLObject = GraphQLObject,
_Input extends {} = []
_Input extends GraphQLVariables = GraphQLVariables
> = {
data: _Data
partial: boolean
Expand Down
4 changes: 2 additions & 2 deletions packages/houdini-react/src/runtime/hooks/useDocumentStore.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { DocumentArtifact, QueryResult } from '$houdini/lib/types'
import type { DocumentArtifact, GraphQLVariables, QueryResult } from '$houdini/lib/types'
import type { DocumentStore, ObserveParams } from '$houdini/runtime/client'
import type { GraphQLObject } from 'houdini'
import * as React from 'react'
Expand All @@ -15,7 +15,7 @@ export type UseDocumentStoreParams<

export function useDocumentStore<
_Data extends GraphQLObject = GraphQLObject,
_Input extends {} = {},
_Input extends GraphQLVariables = GraphQLVariables,
_Artifact extends DocumentArtifact = DocumentArtifact
>({
artifact,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { DocumentArtifact, QueryResult } from '$houdini/lib/types'
import type { DocumentArtifact, GraphQLVariables, QueryResult } from '$houdini/lib/types'
import type { DocumentStore, SendParams } from '$houdini/runtime/client'
import type { GraphQLObject } from 'houdini'

Expand All @@ -8,7 +8,7 @@ import { useDocumentStore, type UseDocumentStoreParams } from './useDocumentStor
export function useDocumentSubscription<
_Artifact extends DocumentArtifact = DocumentArtifact,
_Data extends GraphQLObject = GraphQLObject,
_Input extends {} = {}
_Input extends GraphQLVariables = GraphQLVariables
>({
artifact,
variables,
Expand Down
4 changes: 2 additions & 2 deletions packages/houdini-react/src/runtime/hooks/useFragment.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import cache from '$houdini/runtime/cache'
import { deepEquals } from '$houdini/runtime/lib/deepEquals'
import { fragmentKey } from '$houdini/runtime/lib/types'
import type { GraphQLObject, FragmentArtifact } from '$houdini/runtime/lib/types'
import type { GraphQLObject, GraphQLVariables, FragmentArtifact } from '$houdini/runtime/lib/types'
import * as React from 'react'

import { useDeepCompareMemoize } from './useDeepCompareEffect'
Expand All @@ -10,7 +10,7 @@ import { useDocumentSubscription } from './useDocumentSubscription'
export function useFragment<
_Data extends GraphQLObject,
_ReferenceType extends {},
_Input extends {} = {}
_Input extends GraphQLVariables = GraphQLVariables
>(
reference: _Data | { [fragmentKey]: _ReferenceType } | null,
document: { artifact: FragmentArtifact }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type {
FragmentArtifact,
QueryArtifact,
fragmentKey,
GraphQLVariables,
} from '$houdini/runtime/lib/types'

import { useDocumentHandle, type DocumentHandle } from './useDocumentHandle'
Expand All @@ -16,7 +17,7 @@ export function useFragmentHandle<
_Data extends GraphQLObject,
_ReferenceType extends {},
_PaginationArtifact extends QueryArtifact,
_Input extends {} = {}
_Input extends GraphQLVariables = GraphQLVariables
>(
reference: _Data | { [fragmentKey]: _ReferenceType } | null,
document: { artifact: FragmentArtifact; refetchArtifact?: QueryArtifact }
Expand Down
9 changes: 7 additions & 2 deletions packages/houdini-react/src/runtime/hooks/useMutation.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import type { MutationArtifact, GraphQLObject, QueryResult } from '$houdini/runtime/lib/types'
import type {
MutationArtifact,
GraphQLObject,
QueryResult,
GraphQLVariables,
} from '$houdini/runtime/lib/types'

import { useDocumentStore } from './useDocumentStore'

Expand All @@ -12,7 +17,7 @@ export type MutationHandler<_Result, _Input, _Optimistic extends GraphQLObject>

export function useMutation<
_Result extends GraphQLObject,
_Input extends {},
_Input extends GraphQLVariables,
_Optimistic extends GraphQLObject
>({
artifact,
Expand Down
4 changes: 2 additions & 2 deletions packages/houdini-react/src/runtime/hooks/useQuery.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import type { GraphQLObject, QueryArtifact } from '$houdini/runtime/lib/types'
import type { GraphQLVariables, GraphQLObject, QueryArtifact } from '$houdini/runtime/lib/types'

import type { UseQueryConfig } from './useQueryHandle'
import { useQueryHandle } from './useQueryHandle'

export function useQuery<
_Artifact extends QueryArtifact,
_Data extends GraphQLObject = GraphQLObject,
_Input extends {} = []
_Input extends GraphQLVariables = GraphQLVariables
>(
document: { artifact: QueryArtifact },
variables: any = null,
Expand Down
9 changes: 7 additions & 2 deletions packages/houdini-react/src/runtime/hooks/useQueryHandle.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import type { GraphQLObject, CachePolicies, QueryArtifact } from '$houdini/runtime/lib/types'
import type {
GraphQLObject,
CachePolicies,
QueryArtifact,
GraphQLVariables,
} from '$houdini/runtime/lib/types'
import React from 'react'

import { createCache } from '../lib/cache'
Expand Down Expand Up @@ -28,7 +33,7 @@ type QuerySuspenseUnit = {
export function useQueryHandle<
_Artifact extends QueryArtifact,
_Data extends GraphQLObject = GraphQLObject,
_Input extends {} = []
_Input extends GraphQLVariables = GraphQLVariables
>(
{ artifact }: { artifact: QueryArtifact },
variables: any = null,
Expand Down
8 changes: 6 additions & 2 deletions packages/houdini-react/src/runtime/hooks/useSubscription.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import type { SubscriptionArtifact, GraphQLObject } from '$houdini/runtime/lib/types'
import type {
SubscriptionArtifact,
GraphQLObject,
GraphQLVariables,
} from '$houdini/runtime/lib/types'

import { useSubscriptionHandle } from './useSubscriptionHandle'

// a hook to subscribe to a subscription artifact
export function useSubscription<_Result extends GraphQLObject, _Input extends {}>(
export function useSubscription<_Result extends GraphQLObject, _Input extends GraphQLVariables>(
document: { artifact: SubscriptionArtifact },
variables: _Input
) {
Expand Down
16 changes: 10 additions & 6 deletions packages/houdini-react/src/runtime/hooks/useSubscriptionHandle.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import type { SubscriptionArtifact, GraphQLObject } from '$houdini/runtime/lib/types'
import type {
SubscriptionArtifact,
GraphQLObject,
GraphQLVariables,
} from '$houdini/runtime/lib/types'

import { useDocumentSubscription } from './useDocumentSubscription'

export type SubscriptionHandle<_Result extends GraphQLObject, _Input extends {} | null> = {
export type SubscriptionHandle<_Result extends GraphQLObject, _Input extends GraphQLVariables> = {
data: _Result | null
errors: { message: string }[] | null
variables: _Input
Expand All @@ -12,10 +16,10 @@ export type SubscriptionHandle<_Result extends GraphQLObject, _Input extends {}
}

// a hook to subscribe to a subscription artifact
export function useSubscriptionHandle<_Result extends GraphQLObject, _Input extends {}>(
{ artifact }: { artifact: SubscriptionArtifact },
variables: _Input
) {
export function useSubscriptionHandle<
_Result extends GraphQLObject,
_Input extends GraphQLVariables
>({ artifact }: { artifact: SubscriptionArtifact }, variables: _Input) {
// a subscription is basically just a live document
const [storeValue, observer] = useDocumentSubscription({
artifact,
Expand Down
2 changes: 1 addition & 1 deletion packages/houdini-svelte/src/runtime/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { QueryStore } from './stores'
import type { QueryStore } from './stores'

export * from './adapter'
export * from './stores'
Expand Down
9 changes: 7 additions & 2 deletions packages/houdini-svelte/src/runtime/stores/base.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { DocumentStore, type ObserveParams } from '$houdini/runtime/client'
import type { GraphQLObject, DocumentArtifact, QueryResult } from '$houdini/runtime/lib/types'
import type {
GraphQLObject,
DocumentArtifact,
QueryResult,
GraphQLVariables,
} from '$houdini/runtime/lib/types'
import { get } from 'svelte/store'
import type { Readable } from 'svelte/store'

Expand All @@ -8,7 +13,7 @@ import { getClient, initClient } from '../client'

export class BaseStore<
_Data extends GraphQLObject,
_Input extends {},
_Input extends GraphQLVariables,
_Artifact extends DocumentArtifact = DocumentArtifact
> {
// the underlying data
Expand Down
3 changes: 2 additions & 1 deletion packages/houdini-svelte/src/runtime/stores/fragment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import type {
GraphQLObject,
FragmentArtifact,
HoudiniFetchContext,
GraphQLVariables,
} from '$houdini/runtime/lib/types'
import { CompiledFragmentKind, fragmentKey } from '$houdini/runtime/lib/types'
import { derived } from 'svelte/store'
Expand All @@ -19,7 +20,7 @@ import { BaseStore } from './base'
export class FragmentStore<
_Data extends GraphQLObject,
_ReferenceType extends {},
_Input extends {} = {}
_Input extends GraphQLVariables = GraphQLVariables
> {
artifact: FragmentArtifact
name: string
Expand Down
9 changes: 7 additions & 2 deletions packages/houdini-svelte/src/runtime/stores/mutation.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import type { MutationArtifact, GraphQLObject, QueryResult } from '$houdini/runtime/lib/types'
import type {
MutationArtifact,
GraphQLObject,
QueryResult,
GraphQLVariables,
} from '$houdini/runtime/lib/types'
import type { RequestEvent } from '@sveltejs/kit'

import { initClient } from '../client'
Expand All @@ -7,7 +12,7 @@ import { fetchParams } from './query'

export class MutationStore<
_Data extends GraphQLObject,
_Input extends {},
_Input extends GraphQLVariables,
_Optimistic extends GraphQLObject
> extends BaseStore<_Data, _Input, MutationArtifact> {
kind = 'HoudiniMutation' as const
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import type {
QueryArtifact,
PageInfo,
CursorHandlers,
GraphQLVariables,
} from '$houdini/runtime/lib/types'
import { CompiledFragmentKind } from '$houdini/runtime/lib/types'
import type { Readable, Subscriber } from 'svelte/store'
Expand Down Expand Up @@ -76,11 +77,11 @@ class BasePaginatedFragmentStore<_Data extends GraphQLObject, _Input> {
// both cursor paginated stores add a page info to their subscribe
export class FragmentStoreCursor<
_Data extends GraphQLObject,
_Input extends Record<string, any>
_Input extends GraphQLVariables
> extends BasePaginatedFragmentStore<_Data, _Input> {
// we want to add the cursor-based fetch to the return value of get
get(initialValue: _Data | null) {
const base = new FragmentStore<_Data, _Input>({
const base = new FragmentStore<_Data, {}, _Input>({
artifact: this.artifact,
storeName: this.name,
})
Expand All @@ -97,7 +98,7 @@ export class FragmentStoreCursor<
initialValue,
() => get(store),
// the variables that are needed for this query are the store's values and the ids
() => store.variables as _Input
() => store.variables as NonNullable<_Input>
)

const subscribe = (
Expand Down Expand Up @@ -134,7 +135,7 @@ export class FragmentStoreCursor<
observer: DocumentStore<_Data, _Input>,
initialValue: _Data | null,
getState: () => _Data | null,
getVariables: () => _Input
getVariables: () => NonNullable<_Input>
): CursorHandlers<_Data, _Input> {
return cursorHandlers<_Data, _Input>({
getState,
Expand Down Expand Up @@ -178,10 +179,10 @@ export class FragmentStoreCursor<

export class FragmentStoreOffset<
_Data extends GraphQLObject,
_Input extends Record<string, any>
_Input extends GraphQLVariables
> extends BasePaginatedFragmentStore<_Data, _Input> {
get(initialValue: _Data | null): OffsetFragmentStoreInstance<_Data, _Input> {
const base = new FragmentStore<_Data, _Input>({
const base = new FragmentStore<_Data, {}, _Input>({
artifact: this.artifact,
storeName: this.name,
})
Expand Down
25 changes: 13 additions & 12 deletions packages/houdini-svelte/src/runtime/stores/pagination/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type {
CursorHandlers,
OffsetHandlers,
PageInfo,
GraphQLVariables,
} from '$houdini/runtime/lib/types'
import { get, derived } from 'svelte/store'
import type { Subscriber } from 'svelte/store'
Expand All @@ -22,16 +23,16 @@ import type {
import type { StoreConfig } from '../query'
import { QueryStore } from '../query'

export type CursorStoreResult<_Data extends GraphQLObject, _Input extends {}> = QueryResult<
_Data,
_Input
> & { pageInfo: PageInfo }
export type CursorStoreResult<
_Data extends GraphQLObject,
_Input extends GraphQLVariables
> = QueryResult<_Data, _Input> & { pageInfo: PageInfo }

// both cursor paginated stores add a page info to their subscribe
export class QueryStoreCursor<_Data extends GraphQLObject, _Input extends {}> extends QueryStore<
_Data,
_Input
> {
export class QueryStoreCursor<
_Data extends GraphQLObject,
_Input extends GraphQLVariables
> extends QueryStore<_Data, _Input> {
// all paginated stores need to have a flag to distinguish from other query stores
paginated = true

Expand Down Expand Up @@ -111,10 +112,10 @@ export class QueryStoreCursor<_Data extends GraphQLObject, _Input extends {}> ex
}
}

export class QueryStoreOffset<_Data extends GraphQLObject, _Input extends {}> extends QueryStore<
_Data,
_Input
> {
export class QueryStoreOffset<
_Data extends GraphQLObject,
_Input extends GraphQLVariables
> extends QueryStore<_Data, _Input> {
// all paginated stores need to have a flag to distinguish from other query stores
paginated = true

Expand Down
10 changes: 5 additions & 5 deletions packages/houdini-svelte/src/runtime/stores/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { getCurrentConfig } from '$houdini/runtime/lib/config'
import * as log from '$houdini/runtime/lib/log'
import type {
CachePolicies,
GraphQLVariables,
GraphQLObject,
MutationArtifact,
QueryArtifact,
Expand All @@ -25,11 +26,10 @@ import type {
} from '../types'
import { BaseStore } from './base'

export class QueryStore<_Data extends GraphQLObject, _Input extends {}> extends BaseStore<
_Data,
_Input,
QueryArtifact
> {
export class QueryStore<
_Data extends GraphQLObject,
_Input extends GraphQLVariables
> extends BaseStore<_Data, _Input, QueryArtifact> {
// whether the store requires variables for input
variables: boolean

Expand Down
Loading

0 comments on commit 361e2b5

Please sign in to comment.