Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow GraphQL documents to be typed with a TypedDocumentNode for fully-typed result and variables objects #9619

Merged
merged 11 commits into from
Dec 28, 2023
Merged
3 changes: 1 addition & 2 deletions packages/internal/src/__tests__/clientPreset.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,13 @@ describe('Generate client preset', () => {

const { clientPresetFiles } = await generateClientPreset()

expect(clientPresetFiles).toHaveLength(6)
expect(clientPresetFiles).toHaveLength(5)
const expectedEndings = [
'/fragment-masking.ts',
'/index.ts',
'/gql.ts',
'/graphql.ts',
'/persisted-documents.json',
'/types.d.ts',
]

const foundEndings = expectedEndings.filter((expectedEnding) =>
Expand Down
21 changes: 0 additions & 21 deletions packages/internal/src/generate/clientPreset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,27 +32,6 @@ export const generateClientPreset = async () => {
schema: getPaths().generated.schema,
documents: documentsGlob,
generates: {
// should be graphql.d.ts
Tobbe marked this conversation as resolved.
Show resolved Hide resolved
[`${getPaths().web.base}/types/types.d.ts`]: {
plugins: ['typescript', 'typescript-operations', 'add'],
config: {
enumsAsTypes: true,
content: 'import { Prisma } from "@prisma/client"',
placement: 'prepend',
scalars: {
// We need these, otherwise these scalars are mapped to any
BigInt: 'number',
// @Note: DateTime fields can be valid Date-strings, or the Date object in the api side. They're always strings on the web side.
DateTime: 'string',
Date: 'string',
JSON: 'Prisma.JsonValue',
JSONObject: 'Prisma.JsonObject',
Time: 'string',
},
namingConvention: 'keep', // to allow camelCased query names
omitOperationSuffix: true,
},
},
[`${getPaths().web.src}/graphql/`]: {
preset: 'client',
presetConfig: {
Expand Down
19 changes: 11 additions & 8 deletions packages/web/src/components/GraphQLHooksProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@ import type {
useBackgroundQuery as apolloUseBackgroundQuery,
useReadQuery as apolloUseReadQuery,
} from '@apollo/client'
import type { TypedDocumentNode } from '@graphql-typed-document-node/core'
import type { DocumentNode } from 'graphql'

export type { TypedDocumentNode }

/**
* @NOTE
* The types QueryOperationResult, MutationOperationResult, SubscriptionOperationResult, and SuspenseQueryOperationResult
Expand All @@ -19,31 +22,31 @@ type DefaultUseQueryType = <
TData = any,
TVariables extends OperationVariables = GraphQLOperationVariables
>(
query: DocumentNode,
query: DocumentNode | TypedDocumentNode<TData, TVariables>,
options?: GraphQLQueryHookOptions<TData, TVariables>
) => QueryOperationResult<TData, TVariables>

type DefaultUseMutationType = <
TData = any,
TVariables = GraphQLOperationVariables
>(
mutation: DocumentNode,
mutation: DocumentNode | TypedDocumentNode<TData, TVariables>,
options?: GraphQLMutationHookOptions<TData, TVariables>
) => MutationOperationResult<TData, TVariables>

type DefaultUseSubscriptionType = <
TData = any,
TVariables extends OperationVariables = GraphQLOperationVariables
>(
subscription: DocumentNode,
subscription: DocumentNode | TypedDocumentNode<TData, TVariables>,
options?: GraphQLSubscriptionHookOptions<TData, TVariables>
) => SubscriptionOperationResult<TData, TVariables>

type DefaultUseSuspenseType = <
TData = any,
TVariables extends OperationVariables = GraphQLOperationVariables
>(
query: DocumentNode,
query: DocumentNode | TypedDocumentNode<TData, TVariables>,
options?: GraphQLSuspenseQueryHookOptions<TData, TVariables>
) => SuspenseQueryOperationResult<TData, TVariables>

Expand Down Expand Up @@ -152,7 +155,7 @@ export function useQuery<
TData = any,
TVariables extends OperationVariables = GraphQLOperationVariables
>(
query: DocumentNode,
query: DocumentNode | TypedDocumentNode<TData, TVariables>,
options?: GraphQLQueryHookOptions<TData, TVariables>
): QueryOperationResult<TData, TVariables> {
return React.useContext(GraphQLHooksContext).useQuery<TData, TVariables>(
Expand All @@ -165,7 +168,7 @@ export function useMutation<
TData = any,
TVariables = GraphQLOperationVariables
>(
mutation: DocumentNode,
mutation: DocumentNode | TypedDocumentNode<TData, TVariables>,
options?: GraphQLMutationHookOptions<TData, TVariables>
): MutationOperationResult<TData, TVariables> {
return React.useContext(GraphQLHooksContext).useMutation<TData, TVariables>(
Expand All @@ -178,7 +181,7 @@ export function useSubscription<
TData = any,
TVariables extends OperationVariables = GraphQLOperationVariables
>(
query: DocumentNode,
query: DocumentNode | TypedDocumentNode<TData, TVariables>,
options?: GraphQLSubscriptionHookOptions<TData, TVariables>
): SubscriptionOperationResult<TData, TVariables> {
return React.useContext(GraphQLHooksContext).useSubscription<
Expand All @@ -191,7 +194,7 @@ export function useSuspenseQuery<
TData = any,
TVariables extends OperationVariables = GraphQLOperationVariables
>(
query: DocumentNode,
query: DocumentNode | TypedDocumentNode<TData, TVariables>,
options?: GraphQLSuspenseQueryHookOptions<TData, TVariables>
): SuspenseQueryOperationResult<TData, TVariables> {
return React.useContext(GraphQLHooksContext).useSuspenseQuery<
Expand Down
2 changes: 2 additions & 0 deletions packages/web/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,5 @@ export * from './components/htmlTags'
export * from './routeHooks.types'

export * from './components/ServerInject'

export type { TypedDocumentNode } from './components/GraphQLHooksProvider'
Loading