Skip to content

Commit 30ee6e8

Browse files
committed
fix(typescript-urql-graphcache): improve typing
- resolve a duplicate import - improve typing for "empty object" - respect `defaultScalarType`
1 parent 152d2dd commit 30ee6e8

File tree

4 files changed

+65
-37
lines changed

4 files changed

+65
-37
lines changed

.changeset/spicy-paths-lose.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@graphql-codegen/typescript-urql-graphcache': patch
3+
---
4+
5+
Resolve a duplicate import, improve typing for "empty object" and respect `defaultScalarType`

packages/plugins/typescript/urql-graphcache/src/index.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -276,14 +276,9 @@ function getOptimisticUpdatersConfig(
276276
}
277277

278278
function getImports(config: UrqlGraphCacheConfig): string {
279-
return [
280-
`import { ${
281-
config.offlineExchange ? 'offlineExchange' : 'cacheExchange'
282-
} } from '@urql/exchange-graphcache';`,
283-
`${
284-
config.useTypeImports ? 'import type' : 'import'
285-
} { Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';\n`,
286-
].join('\n');
279+
return `${config.useTypeImports ? 'import type' : 'import'} { ${
280+
config.offlineExchange ? 'offlineExchange' : 'cacheExchange'
281+
}, Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';\n`;
287282
}
288283

289284
export const plugin: PluginFunction<UrqlGraphCacheConfig, Types.ComplexPluginOutput> = (
@@ -305,24 +300,24 @@ export const plugin: PluginFunction<UrqlGraphCacheConfig, Types.ComplexPluginOut
305300
return {
306301
prepend: [imports],
307302
content: [
308-
`export type WithTypename<T extends { __typename?: any }> = Partial<T> & { __typename: NonNullable<T['__typename']> };`,
303+
`export type WithTypename<T extends { __typename?: ${config.defaultScalarType || 'any'} }> = Partial<T> & { __typename: NonNullable<T['__typename']> };`,
309304

310305
keys,
311306

312307
'export type GraphCacheResolvers = {\n' + resolvers.join(',\n') + '\n};',
313308

314309
'export type GraphCacheOptimisticUpdaters = ' +
315-
(optimisticUpdaters ? '{\n ' + optimisticUpdaters.join(',\n ') + '\n};' : '{};'),
310+
(optimisticUpdaters ? '{\n ' + optimisticUpdaters.join(',\n ') + '\n};' : 'object;'),
316311

317312
'export type GraphCacheUpdaters = {\n' +
318313
` ${(queryType && queryType.name) || 'Mutation'}?: ` +
319-
(queryUpdaters ? `{\n ${queryUpdaters.join(',\n ')}\n }` : '{}') +
314+
(queryUpdaters ? `{\n ${queryUpdaters.join(',\n ')}\n }` : 'object') +
320315
',\n' +
321316
` ${(mutationType && mutationType.name) || 'Mutation'}?: ` +
322-
(mutationUpdaters ? `{\n ${mutationUpdaters.join(',\n ')}\n }` : '{}') +
317+
(mutationUpdaters ? `{\n ${mutationUpdaters.join(',\n ')}\n }` : 'object') +
323318
',\n' +
324319
` ${(subscriptionType && subscriptionType.name) || 'Subscription'}?: ` +
325-
(subscriptionUpdaters ? `{\n ${subscriptionUpdaters.join(',\n ')}\n }` : '{}') +
320+
(subscriptionUpdaters ? `{\n ${subscriptionUpdaters.join(',\n ')}\n }` : 'object') +
326321
',\n' +
327322
`${typeUpdateResolvers.join(',\n')}` +
328323
',\n};',

packages/plugins/typescript/urql-graphcache/tests/__snapshots__/urql.spec.ts.snap

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

33
exports[`urql graphcache Should correctly name GraphCacheResolvers & GraphCacheOptimisticUpdaters with nonstandard mutationType names 1`] = `
4-
"import { cacheExchange } from '@urql/exchange-graphcache';
5-
import { Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
4+
"import { cacheExchange, Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
65
76
export type WithTypename<T extends { __typename?: any }> = Partial<T> & { __typename: NonNullable<T['__typename']> };
87
@@ -32,7 +31,7 @@ export type GraphCacheUpdaters = {
3231
Mutation_Root?: {
3332
toggleTodo?: GraphCacheUpdateResolver<{ toggleTodo: WithTypename<Todo> }, Mutation_RootToggleTodoArgs>
3433
},
35-
Subscription?: {},
34+
Subscription?: object,
3635
Todo?: {
3736
id?: GraphCacheUpdateResolver<Maybe<WithTypename<Todo>>, Record<string, never>>,
3837
text?: GraphCacheUpdateResolver<Maybe<WithTypename<Todo>>, Record<string, never>>,
@@ -49,8 +48,7 @@ export type GraphCacheConfig = Parameters<typeof cacheExchange>[0] & {
4948
`;
5049
5150
exports[`urql graphcache Should correctly output GraphCacheOptimisticUpdaters when there are no mutations 1`] = `
52-
"import { cacheExchange } from '@urql/exchange-graphcache';
53-
import { Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
51+
"import { cacheExchange, Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
5452
5553
export type WithTypename<T extends { __typename?: any }> = Partial<T> & { __typename: NonNullable<T['__typename']> };
5654
@@ -69,14 +67,14 @@ export type GraphCacheResolvers = {
6967
}
7068
};
7169
72-
export type GraphCacheOptimisticUpdaters = {};
70+
export type GraphCacheOptimisticUpdaters = object;
7371
7472
export type GraphCacheUpdaters = {
7573
Query_Root?: {
7674
todos?: GraphCacheUpdateResolver<{ todos: Maybe<Array<WithTypename<Todo>>> }, Record<string, never>>
7775
},
78-
Mutation?: {},
79-
Subscription?: {},
76+
Mutation?: object,
77+
Subscription?: object,
8078
Todo?: {
8179
id?: GraphCacheUpdateResolver<Maybe<WithTypename<Todo>>, Record<string, never>>,
8280
text?: GraphCacheUpdateResolver<Maybe<WithTypename<Todo>>, Record<string, never>>,
@@ -93,8 +91,7 @@ export type GraphCacheConfig = Parameters<typeof cacheExchange>[0] & {
9391
`;
9492
9593
exports[`urql graphcache Should output the cache-generic correctly (with interfaces) 1`] = `
96-
"import { cacheExchange } from '@urql/exchange-graphcache';
97-
import { Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
94+
"import { cacheExchange, Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
9895
9996
export type WithTypename<T extends { __typename?: any }> = Partial<T> & { __typename: NonNullable<T['__typename']> };
10097
@@ -128,14 +125,14 @@ export type GraphCacheResolvers = {
128125
}
129126
};
130127
131-
export type GraphCacheOptimisticUpdaters = {};
128+
export type GraphCacheOptimisticUpdaters = object;
132129
133130
export type GraphCacheUpdaters = {
134131
Query?: {
135132
schoolBooks?: GraphCacheUpdateResolver<{ schoolBooks: Maybe<Array<WithTypename<Textbook>>> }, Record<string, never>>
136133
},
137-
Mutation?: {},
138-
Subscription?: {},
134+
Mutation?: object,
135+
Subscription?: object,
139136
Author?: {
140137
id?: GraphCacheUpdateResolver<Maybe<WithTypename<Author>>, Record<string, never>>,
141138
name?: GraphCacheUpdateResolver<Maybe<WithTypename<Author>>, Record<string, never>>,
@@ -165,8 +162,7 @@ export type GraphCacheConfig = Parameters<typeof cacheExchange>[0] & {
165162
`;
166163
167164
exports[`urql graphcache Should output the cache-generic correctly (with typesPrefix and typesSuffix) 1`] = `
168-
"import { cacheExchange } from '@urql/exchange-graphcache';
169-
import { Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
165+
"import { cacheExchange, Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
170166
171167
export type WithTypename<T extends { __typename?: any }> = Partial<T> & { __typename: NonNullable<T['__typename']> };
172168
@@ -212,7 +208,7 @@ export type GraphCacheUpdaters = {
212208
toggleTodosOptionalEntity?: GraphCacheUpdateResolver<{ toggleTodosOptionalEntity: Array<WithTypename<PrefixTodoSuffix>> }, PrefixMutationToggleTodosOptionalEntityArgsSuffix>,
213209
toggleTodosOptional?: GraphCacheUpdateResolver<{ toggleTodosOptional: Maybe<Array<WithTypename<PrefixTodoSuffix>>> }, PrefixMutationToggleTodosOptionalArgsSuffix>
214210
},
215-
Subscription?: {},
211+
Subscription?: object,
216212
Author?: {
217213
id?: GraphCacheUpdateResolver<Maybe<WithTypename<PrefixAuthorSuffix>>, Record<string, never>>,
218214
name?: GraphCacheUpdateResolver<Maybe<WithTypename<PrefixAuthorSuffix>>, Record<string, never>>,
@@ -236,8 +232,7 @@ export type GraphCacheConfig = Parameters<typeof cacheExchange>[0] & {
236232
`;
237233
238234
exports[`urql graphcache Should output the cache-generic correctly (with unions) 1`] = `
239-
"import { cacheExchange } from '@urql/exchange-graphcache';
240-
import { Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
235+
"import { cacheExchange, Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
241236
242237
export type WithTypename<T extends { __typename?: any }> = Partial<T> & { __typename: NonNullable<T['__typename']> };
243238
@@ -273,7 +268,7 @@ export type GraphCacheUpdaters = {
273268
Mutation?: {
274269
updateMedia?: GraphCacheUpdateResolver<{ updateMedia: Maybe<WithTypename<Media>> }, MutationUpdateMediaArgs>
275270
},
276-
Subscription?: {},
271+
Subscription?: object,
277272
Book?: {
278273
id?: GraphCacheUpdateResolver<Maybe<WithTypename<Book>>, Record<string, never>>,
279274
title?: GraphCacheUpdateResolver<Maybe<WithTypename<Book>>, Record<string, never>>,
@@ -295,8 +290,7 @@ export type GraphCacheConfig = Parameters<typeof cacheExchange>[0] & {
295290
`;
296291
297292
exports[`urql graphcache Should output the cache-generic correctly 1`] = `
298-
"import { cacheExchange } from '@urql/exchange-graphcache';
299-
import { Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
293+
"import { cacheExchange, Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
300294
301295
export type WithTypename<T extends { __typename?: any }> = Partial<T> & { __typename: NonNullable<T['__typename']> };
302296
@@ -342,7 +336,7 @@ export type GraphCacheUpdaters = {
342336
toggleTodosOptionalEntity?: GraphCacheUpdateResolver<{ toggleTodosOptionalEntity: Array<WithTypename<Todo>> }, MutationToggleTodosOptionalEntityArgs>,
343337
toggleTodosOptional?: GraphCacheUpdateResolver<{ toggleTodosOptional: Maybe<Array<WithTypename<Todo>>> }, MutationToggleTodosOptionalArgs>
344338
},
345-
Subscription?: {},
339+
Subscription?: object,
346340
Author?: {
347341
id?: GraphCacheUpdateResolver<Maybe<WithTypename<Author>>, Record<string, never>>,
348342
name?: GraphCacheUpdateResolver<Maybe<WithTypename<Author>>, Record<string, never>>,

packages/plugins/typescript/urql-graphcache/tests/urql.spec.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,45 @@ describe('urql graphcache', () => {
166166
const result = mergeOutputs([await plugin(schema, [], { useTypeImports: true })]);
167167

168168
expect(result).toBeSimilarStringTo(`\
169-
import { cacheExchange } from '@urql/exchange-graphcache';
170-
import type { Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
169+
import type { cacheExchange, Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver } from '@urql/exchange-graphcache';
171170
`);
172171
});
173172

173+
it('should emit default scalar type if defaultScalarType config value is used', async () => {
174+
const schema = buildSchema(/* GraphQL */ `
175+
type Query {
176+
todos: [Todo]
177+
}
178+
179+
type Mutation {
180+
toggleTodo(id: ID!): Todo!
181+
toggleTodos(id: [ID!]!): [Todo!]!
182+
toggleTodosOptionalArray(id: [ID!]!): [Todo!]
183+
toggleTodosOptionalEntity(id: [ID!]!): [Todo]!
184+
toggleTodosOptional(id: [ID!]!): [Todo]
185+
}
186+
187+
type Author {
188+
id: ID
189+
name: String
190+
friends: [Author]
191+
friendsPaginated(from: Int!, limit: Int!): [Author]
192+
}
193+
194+
type Todo {
195+
id: ID
196+
text: String
197+
complete: Boolean
198+
author: Author
199+
}
200+
`);
201+
const result = mergeOutputs([await plugin(schema, [], { defaultScalarType: 'unknown' })]);
202+
203+
expect(result).toMatch(
204+
`export type WithTypename<T extends { __typename?: unknown }> = Partial<T> & { __typename: NonNullable<T['__typename']> };`,
205+
);
206+
});
207+
174208
it('Should correctly name GraphCacheResolvers & GraphCacheOptimisticUpdaters with nonstandard mutationType names', async () => {
175209
const schema = buildSchema(/* GraphQL */ `
176210
schema {

0 commit comments

Comments
 (0)