1import { describe, it } from 'vitest';
2import {
3 cacheExchange,
4 Resolver as GraphCacheResolver,
5 UpdateResolver as GraphCacheUpdateResolver,
6 OptimisticMutationResolver as GraphCacheOptimisticMutationResolver,
7} from './index';
8
9type Maybe<T> = T | null;
10
11type Scalars = {
12 ID: string;
13 String: string;
14 Boolean: boolean;
15 Int: number;
16 Float: number;
17};
18type Author = {
19 __typename?: 'Author';
20 id?: Maybe<Scalars['ID']>;
21 name?: Maybe<Scalars['String']>;
22 friends?: Maybe<Array<Maybe<Author>>>;
23 friendsPaginated?: Maybe<Array<Maybe<Author>>>;
24};
25
26type MutationToggleTodoArgs = {
27 id: Scalars['ID'];
28};
29
30type Query = {
31 __typename?: 'Query';
32 todos?: Maybe<Array<Maybe<Todo>>>;
33};
34
35type Todo = {
36 __typename?: 'Todo';
37 id?: Maybe<Scalars['ID']>;
38 text?: Maybe<Scalars['String']>;
39 complete?: Maybe<Scalars['Boolean']>;
40 author?: Maybe<Author>;
41};
42
43type WithTypename<T extends { __typename?: any }> = {
44 [K in Exclude<keyof T, '__typename'>]?: T[K];
45} & { __typename: NonNullable<T['__typename']> };
46
47type GraphCacheKeysConfig = {
48 Todo?: (data: WithTypename<Todo>) => null | string;
49};
50
51type GraphCacheResolvers = {
52 Query?: {
53 todos?: GraphCacheResolver<
54 WithTypename<Query>,
55 Record<string, never>,
56 Array<WithTypename<Todo> | string>
57 >;
58 };
59 Todo?: {
60 id?: GraphCacheResolver<
61 WithTypename<Todo>,
62 Record<string, never>,
63 Scalars['ID'] | string
64 >;
65 text?: GraphCacheResolver<
66 WithTypename<Todo>,
67 Record<string, never>,
68 Scalars['String'] | string
69 >;
70 complete?: GraphCacheResolver<
71 WithTypename<Todo>,
72 Record<string, never>,
73 Scalars['Boolean'] | string
74 >;
75 author?: GraphCacheResolver<
76 WithTypename<Todo>,
77 Record<string, never>,
78 WithTypename<Author> | string
79 >;
80 };
81};
82
83type GraphCacheOptimisticUpdaters = {
84 toggleTodo?: GraphCacheOptimisticMutationResolver<
85 MutationToggleTodoArgs,
86 WithTypename<Todo>
87 >;
88};
89
90type GraphCacheUpdaters = {
91 Mutation?: {
92 toggleTodo?: GraphCacheUpdateResolver<
93 { toggleTodo: WithTypename<Todo> },
94 MutationToggleTodoArgs
95 >;
96 };
97 Subscription?: {};
98};
99
100type GraphCacheConfig = {
101 updates?: GraphCacheUpdaters;
102 keys?: GraphCacheKeysConfig;
103 optimistic?: GraphCacheOptimisticUpdaters;
104 resolvers?: GraphCacheResolvers;
105};
106
107describe('typings', function () {
108 it('should work with a generic', function () {
109 cacheExchange<GraphCacheConfig>({
110 keys: {
111 Todo: data => data.id || null,
112 },
113 updates: {
114 Mutation: {
115 toggleTodo: result => {
116 result.toggleTodo.author?.name;
117 },
118 },
119 },
120 resolvers: {
121 Todo: {
122 id: parent => parent.id + '_' + parent.complete,
123 },
124 },
125 optimistic: {
126 toggleTodo: (args, cache) => {
127 return {
128 __typename: 'Todo',
129 complete: !cache.resolve(
130 { __typename: 'Todo', id: args.id },
131 'complete'
132 ),
133 id: args.id,
134 };
135 },
136 },
137 });
138 });
139});