@eddeee888/gcg-typescript-resolver-files 0.18.0 → 0.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/defineConfig.d.ts +1 -1
- package/dist/defineConfig.js +8 -0
- package/package.json +7 -3
- package/CHANGELOG.md +0 -816
- package/DEVELOPMENT.md +0 -49
- package/dist/tsconfig.lib.tsbuildinfo +0 -1
- package/eslint.config.mjs +0 -22
- package/project.json +0 -8
- package/src/addVirtualTypesFileToTsMorphProject/addVirtualTypesFileToTsMorphProject.ts +0 -109
- package/src/addVirtualTypesFileToTsMorphProject/index.ts +0 -1
- package/src/defineConfig.spec.ts +0 -76
- package/src/defineConfig.ts +0 -37
- package/src/generateResolverFiles/addExternalResolverImport.ts +0 -185
- package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.spec.ts +0 -1174
- package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.ts +0 -144
- package/src/generateResolverFiles/addResolverMainFiles.ts +0 -343
- package/src/generateResolverFiles/ensureEnumTypeResolversAreGenerated.ts +0 -51
- package/src/generateResolverFiles/generateResolverFiles.ts +0 -148
- package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.spec.ts +0 -127
- package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.ts +0 -25
- package/src/generateResolverFiles/getVariableStatementWithExpectedIdentifier.spec.ts +0 -147
- package/src/generateResolverFiles/getVariableStatementWithExpectedIdentifier.ts +0 -34
- package/src/generateResolverFiles/handleGraphQLEnumType.ts +0 -100
- package/src/generateResolverFiles/handleGraphQLInterfaceType.ts +0 -70
- package/src/generateResolverFiles/handleGraphQLObjectType.ts +0 -171
- package/src/generateResolverFiles/handleGraphQLRootObjectTypeField.ts +0 -105
- package/src/generateResolverFiles/handleGraphQLScalarType.ts +0 -81
- package/src/generateResolverFiles/handleGraphQLUnionType.ts +0 -68
- package/src/generateResolverFiles/index.ts +0 -2
- package/src/generateResolverFiles/postProcessFiles.ts +0 -287
- package/src/generateResolverFiles/types.ts +0 -203
- package/src/generateResolverFiles/visitNamedType.ts +0 -66
- package/src/generateTypeDefsFiles/generateTypeDefsContent.ts +0 -15
- package/src/generateTypeDefsFiles/generateTypeDefsFiles.ts +0 -100
- package/src/generateTypeDefsFiles/index.ts +0 -1
- package/src/getGraphQLObjectTypeResolversToGenerate/getGraphQLObjectTypeResolversToGenerate.ts +0 -361
- package/src/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.spec.ts +0 -115
- package/src/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.ts +0 -88
- package/src/getGraphQLObjectTypeResolversToGenerate/index.ts +0 -1
- package/src/index.ts +0 -3
- package/src/normalizeAddConfigPath/index.ts +0 -1
- package/src/normalizeAddConfigPath/normalizeAddConfigPath.ts +0 -29
- package/src/parseGraphQLSchema/index.ts +0 -2
- package/src/parseGraphQLSchema/normalizeResolverName.ts +0 -28
- package/src/parseGraphQLSchema/parseGraphQLSchema.ts +0 -531
- package/src/parseGraphQLSchema/parseLocationForOutputDir.ts +0 -76
- package/src/parseSources/index.ts +0 -1
- package/src/parseSources/parseSources.ts +0 -83
- package/src/parseTypeMappers/collectTypeMappersFromSourceFile.spec.ts +0 -789
- package/src/parseTypeMappers/collectTypeMappersFromSourceFile.ts +0 -197
- package/src/parseTypeMappers/index.ts +0 -1
- package/src/parseTypeMappers/parseTypeMappers.ts +0 -75
- package/src/preset.ts +0 -317
- package/src/utils/cwd.ts +0 -8
- package/src/utils/fmt.ts +0 -16
- package/src/utils/index.ts +0 -12
- package/src/utils/isMatchResolverNamePattern.ts +0 -27
- package/src/utils/isNativeNamedType.ts +0 -21
- package/src/utils/isRootObjectType.ts +0 -8
- package/src/utils/isWhitelistedModule.spec.ts +0 -71
- package/src/utils/isWhitelistedModule.ts +0 -21
- package/src/utils/logger.ts +0 -14
- package/src/utils/normalizeImportExtension.spec.ts +0 -42
- package/src/utils/normalizeImportExtension.ts +0 -16
- package/src/utils/normalizeRelativePath.ts +0 -6
- package/src/utils/parseLocationForWhitelistedModule.spec.ts +0 -130
- package/src/utils/parseLocationForWhitelistedModule.ts +0 -38
- package/src/utils/printImportLine.spec.ts +0 -150
- package/src/utils/printImportLine.ts +0 -78
- package/src/utils/relativeModulePath.ts +0 -7
- package/src/validateAndMergeParsedConfigs/index.ts +0 -1
- package/src/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.spec.ts +0 -211
- package/src/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.ts +0 -92
- package/src/validatePresetConfig/index.ts +0 -1
- package/src/validatePresetConfig/validatePresetConfig.spec.ts +0 -706
- package/src/validatePresetConfig/validatePresetConfig.ts +0 -571
- package/tsconfig.json +0 -14
- package/tsconfig.lib.json +0 -18
- package/tsconfig.spec.json +0 -20
- package/vite.config.ts +0 -24
|
@@ -1,1174 +0,0 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
|
-
import { Project } from 'ts-morph';
|
|
3
|
-
import {
|
|
4
|
-
type AddedPropertyAssignmentNodes,
|
|
5
|
-
addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented,
|
|
6
|
-
} from './addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.js';
|
|
7
|
-
import type { ObjectTypeFile } from './types';
|
|
8
|
-
|
|
9
|
-
const createFilePath = (filePath: string): string =>
|
|
10
|
-
path.join('/path/', filePath);
|
|
11
|
-
|
|
12
|
-
describe('addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented() - mode: smart', () => {
|
|
13
|
-
it('adds missing field resolvers if needed', () => {
|
|
14
|
-
const project = new Project();
|
|
15
|
-
project.createSourceFile(
|
|
16
|
-
createFilePath('user.mappers.ts'),
|
|
17
|
-
`export interface UserMapper {
|
|
18
|
-
id: number;
|
|
19
|
-
firstName: string;
|
|
20
|
-
lastName: string;
|
|
21
|
-
role: 'ADMIN' | 'USER';
|
|
22
|
-
createdAt: Date;
|
|
23
|
-
}`
|
|
24
|
-
);
|
|
25
|
-
project.createSourceFile(
|
|
26
|
-
createFilePath('types.generated.ts'),
|
|
27
|
-
`
|
|
28
|
-
import { UserMapper } from './user.mappers';
|
|
29
|
-
export type Maybe<T> = T | null;
|
|
30
|
-
export type InputMaybe<T> = Maybe<T>;
|
|
31
|
-
export type Exact<T extends { [key: string]: unknown }> = {
|
|
32
|
-
[K in keyof T]: T[K];
|
|
33
|
-
};
|
|
34
|
-
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
|
|
35
|
-
[SubKey in K]?: Maybe<T[SubKey]>;
|
|
36
|
-
};
|
|
37
|
-
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
|
|
38
|
-
[SubKey in K]: Maybe<T[SubKey]>;
|
|
39
|
-
};
|
|
40
|
-
/** All built-in and custom scalars, mapped to their actual values */
|
|
41
|
-
export type Scalars = {
|
|
42
|
-
ID: string;
|
|
43
|
-
String: string;
|
|
44
|
-
Boolean: boolean;
|
|
45
|
-
Int: number;
|
|
46
|
-
Float: number;
|
|
47
|
-
DateTime: Date | string;
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
export type Query = {
|
|
51
|
-
__typename: 'Query';
|
|
52
|
-
me?: Maybe<User>;
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export type User = {
|
|
56
|
-
__typename: 'User';
|
|
57
|
-
accountGitHub?: Maybe<Scalars['String']>;
|
|
58
|
-
accountGoogle?: Maybe<Scalars['String']>;
|
|
59
|
-
createdAt: Scalars['DateTime'];
|
|
60
|
-
fullName: Scalars['String'];
|
|
61
|
-
id: Scalars['ID'];
|
|
62
|
-
role: UserRole;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export type UserRole = 'ADMIN' | 'USER';
|
|
66
|
-
|
|
67
|
-
export type ResolverTypeWrapper<T> = Promise<T> | T;
|
|
68
|
-
|
|
69
|
-
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
|
|
70
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
71
|
-
};
|
|
72
|
-
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
|
|
73
|
-
| ResolverFn<TResult, TParent, TContext, TArgs>
|
|
74
|
-
| ResolverWithResolve<TResult, TParent, TContext, TArgs>;
|
|
75
|
-
|
|
76
|
-
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
|
|
77
|
-
parent: TParent,
|
|
78
|
-
args: TArgs,
|
|
79
|
-
context: TContext,
|
|
80
|
-
info: any
|
|
81
|
-
) => Promise<TResult> | TResult;
|
|
82
|
-
|
|
83
|
-
/** Mapping between all available schema types and the resolvers types */
|
|
84
|
-
export type ResolversTypes = {
|
|
85
|
-
DateTime: ResolverTypeWrapper<Scalars['DateTime']>;
|
|
86
|
-
Query: ResolverTypeWrapper<{}>;
|
|
87
|
-
User: ResolverTypeWrapper<UserMapper>;
|
|
88
|
-
String: ResolverTypeWrapper<Scalars['String']>;
|
|
89
|
-
ID: ResolverTypeWrapper<Scalars['ID']>;
|
|
90
|
-
UserRole: UserRole;
|
|
91
|
-
Boolean: ResolverTypeWrapper<Scalars['Boolean']>;
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
/** Mapping between all available schema types and the resolvers parents */
|
|
95
|
-
export type ResolversParentTypes = {
|
|
96
|
-
DateTime: Scalars['DateTime'];
|
|
97
|
-
Query: {};
|
|
98
|
-
User: UserMapper;
|
|
99
|
-
String: Scalars['String'];
|
|
100
|
-
ID: Scalars['ID'];
|
|
101
|
-
Boolean: Scalars['Boolean'];
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
export type UserResolvers<
|
|
105
|
-
ContextType = any,
|
|
106
|
-
ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']
|
|
107
|
-
> = {
|
|
108
|
-
accountGitHub?: Resolver<
|
|
109
|
-
Maybe<ResolversTypes['String']>,
|
|
110
|
-
ParentType,
|
|
111
|
-
ContextType
|
|
112
|
-
>;
|
|
113
|
-
accountGoogle?: Resolver<
|
|
114
|
-
Maybe<ResolversTypes['String']>,
|
|
115
|
-
ParentType,
|
|
116
|
-
ContextType
|
|
117
|
-
>;
|
|
118
|
-
createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>;
|
|
119
|
-
fullName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
|
120
|
-
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
|
|
121
|
-
role?: Resolver<ResolversTypes['UserRole'], ParentType, ContextType>;
|
|
122
|
-
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
|
123
|
-
};
|
|
124
|
-
`
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
const addedPropertyAssignmentNodes: AddedPropertyAssignmentNodes = {};
|
|
128
|
-
const sourceFile = project.createSourceFile(
|
|
129
|
-
createFilePath('User.ts'),
|
|
130
|
-
`import type { UserResolvers } from './types.generated';
|
|
131
|
-
export const User: UserResolvers = {
|
|
132
|
-
/* Implement logic here */
|
|
133
|
-
};`
|
|
134
|
-
);
|
|
135
|
-
const resolverFile: ObjectTypeFile = {
|
|
136
|
-
__filetype: 'objectType',
|
|
137
|
-
content: '',
|
|
138
|
-
mainImportIdentifier: 'User',
|
|
139
|
-
filesystem: {
|
|
140
|
-
type: 'filesystem',
|
|
141
|
-
contentUpdated: false,
|
|
142
|
-
},
|
|
143
|
-
meta: {
|
|
144
|
-
moduleName: 'user',
|
|
145
|
-
relativePathFromBaseToModule: ['user'],
|
|
146
|
-
normalizedResolverName: {
|
|
147
|
-
base: 'User',
|
|
148
|
-
withModule: 'user.User',
|
|
149
|
-
},
|
|
150
|
-
resolverTypeImportDeclaration: '',
|
|
151
|
-
variableStatement: '',
|
|
152
|
-
resolverType: {
|
|
153
|
-
baseImport: 'UserResolvers',
|
|
154
|
-
final: 'UserResolvers',
|
|
155
|
-
otherVariants: [],
|
|
156
|
-
},
|
|
157
|
-
resolversToGenerate: {
|
|
158
|
-
id: {
|
|
159
|
-
resolverName: 'id',
|
|
160
|
-
resolverDeclaration: `({ id }) => id`,
|
|
161
|
-
},
|
|
162
|
-
accountGitHub: {
|
|
163
|
-
resolverName: 'accountGitHub',
|
|
164
|
-
resolverDeclaration: `({ accountGitHub }) => accountGitHub`,
|
|
165
|
-
},
|
|
166
|
-
accountGoogle: {
|
|
167
|
-
resolverName: 'accountGoogle',
|
|
168
|
-
resolverDeclaration: `({ accountGoogle }) => accountGoogle`,
|
|
169
|
-
},
|
|
170
|
-
fullName: {
|
|
171
|
-
resolverName: 'fullName',
|
|
172
|
-
resolverDeclaration: `({ fullName }) => fullName`,
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented({
|
|
178
|
-
mode: 'smart',
|
|
179
|
-
addedPropertyAssignmentNodes,
|
|
180
|
-
sourceFile,
|
|
181
|
-
resolverFile,
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
// This is `/path/User.ts` file. We target it this way because the path on windows is different from linux
|
|
185
|
-
const file = Object.values(addedPropertyAssignmentNodes)[0];
|
|
186
|
-
|
|
187
|
-
const addedNode1 = file[4];
|
|
188
|
-
expect(addedNode1.__toBeRemoved).toBe(true);
|
|
189
|
-
expect(addedNode1.node.getText()).toBe('id: ({ id }) => id');
|
|
190
|
-
|
|
191
|
-
const addedNode2 = file[5];
|
|
192
|
-
expect(addedNode2.__toBeRemoved).toBe(true);
|
|
193
|
-
expect(addedNode2.node.getText()).toBe(
|
|
194
|
-
'accountGitHub: ({ accountGitHub }) => accountGitHub'
|
|
195
|
-
);
|
|
196
|
-
|
|
197
|
-
const addedNode3 = file[6];
|
|
198
|
-
expect(addedNode3.__toBeRemoved).toBe(true);
|
|
199
|
-
expect(addedNode3.node.getText()).toBe(
|
|
200
|
-
'accountGoogle: ({ accountGoogle }) => accountGoogle'
|
|
201
|
-
);
|
|
202
|
-
|
|
203
|
-
const addedNode4 = file[7];
|
|
204
|
-
expect(addedNode4.__toBeRemoved).toBe(true);
|
|
205
|
-
expect(addedNode4.node.getText()).toBe(
|
|
206
|
-
'fullName: ({ fullName }) => fullName'
|
|
207
|
-
);
|
|
208
|
-
|
|
209
|
-
expect(sourceFile.getText()).toMatchInlineSnapshot(`
|
|
210
|
-
"import type { UserResolvers } from './types.generated';
|
|
211
|
-
export const User: UserResolvers = {
|
|
212
|
-
/* Implement logic here */
|
|
213
|
-
id: ({ id }) => id,
|
|
214
|
-
accountGitHub: ({ accountGitHub }) => accountGitHub,
|
|
215
|
-
accountGoogle: ({ accountGoogle }) => accountGoogle,
|
|
216
|
-
fullName: ({ fullName }) => fullName
|
|
217
|
-
};"
|
|
218
|
-
`);
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
it('adds does not add missing field resolvers if not needed i.e. resolversToGenerate is {}', () => {
|
|
222
|
-
const project = new Project();
|
|
223
|
-
project.createSourceFile(
|
|
224
|
-
createFilePath('user.mappers.ts'),
|
|
225
|
-
`export interface UserMapper {
|
|
226
|
-
id: number;
|
|
227
|
-
fullName: string;
|
|
228
|
-
role: 'ADMIN' | 'USER';
|
|
229
|
-
createdAt: Date;
|
|
230
|
-
}`
|
|
231
|
-
);
|
|
232
|
-
project.createSourceFile(
|
|
233
|
-
createFilePath('types.generated.ts'),
|
|
234
|
-
`
|
|
235
|
-
import { UserMapper } from './user.mappers';
|
|
236
|
-
export type Maybe<T> = T | null;
|
|
237
|
-
export type InputMaybe<T> = Maybe<T>;
|
|
238
|
-
export type Exact<T extends { [key: string]: unknown }> = {
|
|
239
|
-
[K in keyof T]: T[K];
|
|
240
|
-
};
|
|
241
|
-
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
|
|
242
|
-
[SubKey in K]?: Maybe<T[SubKey]>;
|
|
243
|
-
};
|
|
244
|
-
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
|
|
245
|
-
[SubKey in K]: Maybe<T[SubKey]>;
|
|
246
|
-
};
|
|
247
|
-
/** All built-in and custom scalars, mapped to their actual values */
|
|
248
|
-
export type Scalars = {
|
|
249
|
-
ID: string;
|
|
250
|
-
String: string;
|
|
251
|
-
Boolean: boolean;
|
|
252
|
-
Int: number;
|
|
253
|
-
Float: number;
|
|
254
|
-
DateTime: Date | string;
|
|
255
|
-
};
|
|
256
|
-
|
|
257
|
-
export type Query = {
|
|
258
|
-
__typename: 'Query';
|
|
259
|
-
me?: Maybe<User>;
|
|
260
|
-
};
|
|
261
|
-
|
|
262
|
-
export type User = {
|
|
263
|
-
__typename: 'User';
|
|
264
|
-
accountGitHub?: Maybe<Scalars['String']>;
|
|
265
|
-
accountGoogle?: Maybe<Scalars['String']>;
|
|
266
|
-
createdAt: Scalars['DateTime'];
|
|
267
|
-
fullName: Scalars['String'];
|
|
268
|
-
id: Scalars['ID'];
|
|
269
|
-
role: UserRole;
|
|
270
|
-
};
|
|
271
|
-
|
|
272
|
-
export type UserRole = 'ADMIN' | 'USER';
|
|
273
|
-
|
|
274
|
-
export type ResolverTypeWrapper<T> = Promise<T> | T;
|
|
275
|
-
|
|
276
|
-
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
|
|
277
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
278
|
-
};
|
|
279
|
-
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
|
|
280
|
-
| ResolverFn<TResult, TParent, TContext, TArgs>
|
|
281
|
-
| ResolverWithResolve<TResult, TParent, TContext, TArgs>;
|
|
282
|
-
|
|
283
|
-
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
|
|
284
|
-
parent: TParent,
|
|
285
|
-
args: TArgs,
|
|
286
|
-
context: TContext,
|
|
287
|
-
info: any
|
|
288
|
-
) => Promise<TResult> | TResult;
|
|
289
|
-
|
|
290
|
-
/** Mapping between all available schema types and the resolvers types */
|
|
291
|
-
export type ResolversTypes = {
|
|
292
|
-
DateTime: ResolverTypeWrapper<Scalars['DateTime']>;
|
|
293
|
-
Query: ResolverTypeWrapper<{}>;
|
|
294
|
-
User: ResolverTypeWrapper<UserMapper>;
|
|
295
|
-
String: ResolverTypeWrapper<Scalars['String']>;
|
|
296
|
-
ID: ResolverTypeWrapper<Scalars['ID']>;
|
|
297
|
-
UserRole: UserRole;
|
|
298
|
-
Boolean: ResolverTypeWrapper<Scalars['Boolean']>;
|
|
299
|
-
};
|
|
300
|
-
|
|
301
|
-
/** Mapping between all available schema types and the resolvers parents */
|
|
302
|
-
export type ResolversParentTypes = {
|
|
303
|
-
DateTime: Scalars['DateTime'];
|
|
304
|
-
Query: {};
|
|
305
|
-
User: UserMapper;
|
|
306
|
-
String: Scalars['String'];
|
|
307
|
-
ID: Scalars['ID'];
|
|
308
|
-
Boolean: Scalars['Boolean'];
|
|
309
|
-
};
|
|
310
|
-
|
|
311
|
-
export type UserResolvers<
|
|
312
|
-
ContextType = any,
|
|
313
|
-
ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']
|
|
314
|
-
> = {
|
|
315
|
-
accountGitHub?: Resolver<
|
|
316
|
-
Maybe<ResolversTypes['String']>,
|
|
317
|
-
ParentType,
|
|
318
|
-
ContextType
|
|
319
|
-
>;
|
|
320
|
-
accountGoogle?: Resolver<
|
|
321
|
-
Maybe<ResolversTypes['String']>,
|
|
322
|
-
ParentType,
|
|
323
|
-
ContextType
|
|
324
|
-
>;
|
|
325
|
-
createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>;
|
|
326
|
-
fullName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
|
327
|
-
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
|
|
328
|
-
role?: Resolver<ResolversTypes['UserRole'], ParentType, ContextType>;
|
|
329
|
-
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
|
330
|
-
};
|
|
331
|
-
`
|
|
332
|
-
);
|
|
333
|
-
|
|
334
|
-
const addedPropertyAssignmentNodes: AddedPropertyAssignmentNodes = {};
|
|
335
|
-
const sourceFile = project.createSourceFile(
|
|
336
|
-
createFilePath('User.ts'),
|
|
337
|
-
`import type { UserResolvers } from './types.generated';
|
|
338
|
-
export const User: UserResolvers = {};`
|
|
339
|
-
);
|
|
340
|
-
const resolverFile: ObjectTypeFile = {
|
|
341
|
-
__filetype: 'objectType',
|
|
342
|
-
content: '',
|
|
343
|
-
mainImportIdentifier: 'User',
|
|
344
|
-
filesystem: {
|
|
345
|
-
type: 'filesystem',
|
|
346
|
-
contentUpdated: false,
|
|
347
|
-
},
|
|
348
|
-
meta: {
|
|
349
|
-
moduleName: 'user',
|
|
350
|
-
relativePathFromBaseToModule: ['user'],
|
|
351
|
-
normalizedResolverName: {
|
|
352
|
-
base: 'User',
|
|
353
|
-
withModule: 'user.User',
|
|
354
|
-
},
|
|
355
|
-
resolverTypeImportDeclaration: '',
|
|
356
|
-
variableStatement: '',
|
|
357
|
-
resolverType: {
|
|
358
|
-
baseImport: 'UserResolvers',
|
|
359
|
-
final: 'UserResolvers',
|
|
360
|
-
otherVariants: [],
|
|
361
|
-
},
|
|
362
|
-
resolversToGenerate: {},
|
|
363
|
-
},
|
|
364
|
-
};
|
|
365
|
-
addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented({
|
|
366
|
-
mode: 'smart',
|
|
367
|
-
addedPropertyAssignmentNodes,
|
|
368
|
-
sourceFile,
|
|
369
|
-
resolverFile,
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
// This is `/path/User.ts` file. We target it this way because the path on windows is different from linux
|
|
373
|
-
const file = Object.values(addedPropertyAssignmentNodes)[0];
|
|
374
|
-
|
|
375
|
-
expect(file).toEqual({});
|
|
376
|
-
expect(sourceFile.getText()).toMatchInlineSnapshot(`
|
|
377
|
-
"import type { UserResolvers } from './types.generated';
|
|
378
|
-
export const User: UserResolvers = {};"
|
|
379
|
-
`);
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
it('adds missing field resolvers, if necessary, when Mapper is a Class', () => {
|
|
383
|
-
const project = new Project();
|
|
384
|
-
project.createSourceFile(
|
|
385
|
-
createFilePath('user.mappers.ts'),
|
|
386
|
-
`export class UserMapper {
|
|
387
|
-
id: number;
|
|
388
|
-
firstName: string;
|
|
389
|
-
lastName: string;
|
|
390
|
-
role: 'ADMIN' | 'USER';
|
|
391
|
-
createdAt: Date;
|
|
392
|
-
}`
|
|
393
|
-
);
|
|
394
|
-
project.createSourceFile(
|
|
395
|
-
createFilePath('types.generated.ts'),
|
|
396
|
-
`
|
|
397
|
-
import { UserMapper } from './user.mappers';
|
|
398
|
-
export type Maybe<T> = T | null;
|
|
399
|
-
export type InputMaybe<T> = Maybe<T>;
|
|
400
|
-
export type Exact<T extends { [key: string]: unknown }> = {
|
|
401
|
-
[K in keyof T]: T[K];
|
|
402
|
-
};
|
|
403
|
-
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
|
|
404
|
-
[SubKey in K]?: Maybe<T[SubKey]>;
|
|
405
|
-
};
|
|
406
|
-
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
|
|
407
|
-
[SubKey in K]: Maybe<T[SubKey]>;
|
|
408
|
-
};
|
|
409
|
-
/** All built-in and custom scalars, mapped to their actual values */
|
|
410
|
-
export type Scalars = {
|
|
411
|
-
ID: string;
|
|
412
|
-
String: string;
|
|
413
|
-
Boolean: boolean;
|
|
414
|
-
Int: number;
|
|
415
|
-
Float: number;
|
|
416
|
-
DateTime: Date | string;
|
|
417
|
-
};
|
|
418
|
-
|
|
419
|
-
export type Query = {
|
|
420
|
-
__typename: 'Query';
|
|
421
|
-
me?: Maybe<User>;
|
|
422
|
-
};
|
|
423
|
-
|
|
424
|
-
export type User = {
|
|
425
|
-
__typename: 'User';
|
|
426
|
-
accountGitHub?: Maybe<Scalars['String']>;
|
|
427
|
-
accountGoogle?: Maybe<Scalars['String']>;
|
|
428
|
-
createdAt: Scalars['DateTime'];
|
|
429
|
-
fullName: Scalars['String'];
|
|
430
|
-
id: Scalars['ID'];
|
|
431
|
-
role: UserRole;
|
|
432
|
-
};
|
|
433
|
-
|
|
434
|
-
export type UserRole = 'ADMIN' | 'USER';
|
|
435
|
-
|
|
436
|
-
export type ResolverTypeWrapper<T> = Promise<T> | T;
|
|
437
|
-
|
|
438
|
-
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
|
|
439
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
440
|
-
};
|
|
441
|
-
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
|
|
442
|
-
| ResolverFn<TResult, TParent, TContext, TArgs>
|
|
443
|
-
| ResolverWithResolve<TResult, TParent, TContext, TArgs>;
|
|
444
|
-
|
|
445
|
-
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
|
|
446
|
-
parent: TParent,
|
|
447
|
-
args: TArgs,
|
|
448
|
-
context: TContext,
|
|
449
|
-
info: any
|
|
450
|
-
) => Promise<TResult> | TResult;
|
|
451
|
-
|
|
452
|
-
/** Mapping between all available schema types and the resolvers types */
|
|
453
|
-
export type ResolversTypes = {
|
|
454
|
-
DateTime: ResolverTypeWrapper<Scalars['DateTime']>;
|
|
455
|
-
Query: ResolverTypeWrapper<{}>;
|
|
456
|
-
User: ResolverTypeWrapper<UserMapper>;
|
|
457
|
-
String: ResolverTypeWrapper<Scalars['String']>;
|
|
458
|
-
ID: ResolverTypeWrapper<Scalars['ID']>;
|
|
459
|
-
UserRole: UserRole;
|
|
460
|
-
Boolean: ResolverTypeWrapper<Scalars['Boolean']>;
|
|
461
|
-
};
|
|
462
|
-
|
|
463
|
-
/** Mapping between all available schema types and the resolvers parents */
|
|
464
|
-
export type ResolversParentTypes = {
|
|
465
|
-
DateTime: Scalars['DateTime'];
|
|
466
|
-
Query: {};
|
|
467
|
-
User: UserMapper;
|
|
468
|
-
String: Scalars['String'];
|
|
469
|
-
ID: Scalars['ID'];
|
|
470
|
-
Boolean: Scalars['Boolean'];
|
|
471
|
-
};
|
|
472
|
-
|
|
473
|
-
export type UserResolvers<
|
|
474
|
-
ContextType = any,
|
|
475
|
-
ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']
|
|
476
|
-
> = {
|
|
477
|
-
accountGitHub?: Resolver<
|
|
478
|
-
Maybe<ResolversTypes['String']>,
|
|
479
|
-
ParentType,
|
|
480
|
-
ContextType
|
|
481
|
-
>;
|
|
482
|
-
accountGoogle?: Resolver<
|
|
483
|
-
Maybe<ResolversTypes['String']>,
|
|
484
|
-
ParentType,
|
|
485
|
-
ContextType
|
|
486
|
-
>;
|
|
487
|
-
createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>;
|
|
488
|
-
fullName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
|
489
|
-
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
|
|
490
|
-
role?: Resolver<ResolversTypes['UserRole'], ParentType, ContextType>;
|
|
491
|
-
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
|
492
|
-
};
|
|
493
|
-
`
|
|
494
|
-
);
|
|
495
|
-
|
|
496
|
-
const sourceFile = project.createSourceFile(
|
|
497
|
-
createFilePath('User.ts'),
|
|
498
|
-
`import type { UserResolvers } from './types.generated';
|
|
499
|
-
export const User: UserResolvers = {
|
|
500
|
-
/* Implement logic here */
|
|
501
|
-
};`
|
|
502
|
-
);
|
|
503
|
-
const resolverFile: Parameters<
|
|
504
|
-
typeof addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented
|
|
505
|
-
>[0]['resolverFile'] = {
|
|
506
|
-
__filetype: 'objectType',
|
|
507
|
-
content: '',
|
|
508
|
-
filesystem: {
|
|
509
|
-
type: 'filesystem',
|
|
510
|
-
contentUpdated: false,
|
|
511
|
-
},
|
|
512
|
-
mainImportIdentifier: 'User',
|
|
513
|
-
meta: {
|
|
514
|
-
moduleName: 'user',
|
|
515
|
-
relativePathFromBaseToModule: ['user'],
|
|
516
|
-
normalizedResolverName: {
|
|
517
|
-
base: 'User',
|
|
518
|
-
withModule: 'user.User',
|
|
519
|
-
},
|
|
520
|
-
resolverTypeImportDeclaration: '',
|
|
521
|
-
variableStatement: '',
|
|
522
|
-
resolverType: {
|
|
523
|
-
baseImport: 'UserResolvers',
|
|
524
|
-
final: 'UserResolvers',
|
|
525
|
-
otherVariants: [],
|
|
526
|
-
},
|
|
527
|
-
resolversToGenerate: {
|
|
528
|
-
id: {
|
|
529
|
-
resolverName: 'id',
|
|
530
|
-
resolverDeclaration: `({ id }) => id`,
|
|
531
|
-
},
|
|
532
|
-
accountGitHub: {
|
|
533
|
-
resolverName: 'accountGitHub',
|
|
534
|
-
resolverDeclaration: `({ accountGitHub }) => accountGitHub`,
|
|
535
|
-
},
|
|
536
|
-
accountGoogle: {
|
|
537
|
-
resolverName: 'accountGoogle',
|
|
538
|
-
resolverDeclaration: `({ accountGoogle }) => accountGoogle`,
|
|
539
|
-
},
|
|
540
|
-
fullName: {
|
|
541
|
-
resolverName: 'fullName',
|
|
542
|
-
resolverDeclaration: `({ fullName }) => fullName`,
|
|
543
|
-
},
|
|
544
|
-
},
|
|
545
|
-
},
|
|
546
|
-
};
|
|
547
|
-
|
|
548
|
-
const addedPropertyAssignmentNodes: AddedPropertyAssignmentNodes = {};
|
|
549
|
-
addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented({
|
|
550
|
-
mode: 'smart',
|
|
551
|
-
addedPropertyAssignmentNodes,
|
|
552
|
-
sourceFile,
|
|
553
|
-
resolverFile,
|
|
554
|
-
});
|
|
555
|
-
|
|
556
|
-
// This is `/path/User.ts` file. We target it this way because the path on windows is different from linux
|
|
557
|
-
const file = Object.values(addedPropertyAssignmentNodes)[0];
|
|
558
|
-
|
|
559
|
-
const addedNode1 = file[4];
|
|
560
|
-
expect(addedNode1.__toBeRemoved).toBe(true);
|
|
561
|
-
expect(addedNode1.node.getText()).toBe('id: ({ id }) => id');
|
|
562
|
-
|
|
563
|
-
const addedNode2 = file[5];
|
|
564
|
-
expect(addedNode2.__toBeRemoved).toBe(true);
|
|
565
|
-
expect(addedNode2.node.getText()).toBe(
|
|
566
|
-
'accountGitHub: ({ accountGitHub }) => accountGitHub'
|
|
567
|
-
);
|
|
568
|
-
|
|
569
|
-
const addedNode3 = file[6];
|
|
570
|
-
expect(addedNode3.__toBeRemoved).toBe(true);
|
|
571
|
-
expect(addedNode3.node.getText()).toBe(
|
|
572
|
-
'accountGoogle: ({ accountGoogle }) => accountGoogle'
|
|
573
|
-
);
|
|
574
|
-
|
|
575
|
-
const addedNode4 = file[7];
|
|
576
|
-
expect(addedNode4.__toBeRemoved).toBe(true);
|
|
577
|
-
expect(addedNode4.node.getText()).toBe(
|
|
578
|
-
'fullName: ({ fullName }) => fullName'
|
|
579
|
-
);
|
|
580
|
-
|
|
581
|
-
expect(sourceFile.getText()).toMatchInlineSnapshot(`
|
|
582
|
-
"import type { UserResolvers } from './types.generated';
|
|
583
|
-
export const User: UserResolvers = {
|
|
584
|
-
/* Implement logic here */
|
|
585
|
-
id: ({ id }) => id,
|
|
586
|
-
accountGitHub: ({ accountGitHub }) => accountGitHub,
|
|
587
|
-
accountGoogle: ({ accountGoogle }) => accountGoogle,
|
|
588
|
-
fullName: ({ fullName }) => fullName
|
|
589
|
-
};"
|
|
590
|
-
`);
|
|
591
|
-
});
|
|
592
|
-
});
|
|
593
|
-
|
|
594
|
-
describe('addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented() - mode: fast', () => {
|
|
595
|
-
it('adds missing field resolvers if needed', () => {
|
|
596
|
-
const project = new Project();
|
|
597
|
-
project.createSourceFile(
|
|
598
|
-
createFilePath('user.mappers.ts'),
|
|
599
|
-
`export interface UserMapper {
|
|
600
|
-
id: number;
|
|
601
|
-
firstName: string;
|
|
602
|
-
lastName: string;
|
|
603
|
-
role: 'ADMIN' | 'USER';
|
|
604
|
-
createdAt: Date;
|
|
605
|
-
}`
|
|
606
|
-
);
|
|
607
|
-
project.createSourceFile(
|
|
608
|
-
createFilePath('types.generated.ts'),
|
|
609
|
-
`
|
|
610
|
-
import { UserMapper } from './user.mappers';
|
|
611
|
-
export type Maybe<T> = T | null;
|
|
612
|
-
export type InputMaybe<T> = Maybe<T>;
|
|
613
|
-
export type Exact<T extends { [key: string]: unknown }> = {
|
|
614
|
-
[K in keyof T]: T[K];
|
|
615
|
-
};
|
|
616
|
-
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
|
|
617
|
-
[SubKey in K]?: Maybe<T[SubKey]>;
|
|
618
|
-
};
|
|
619
|
-
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
|
|
620
|
-
[SubKey in K]: Maybe<T[SubKey]>;
|
|
621
|
-
};
|
|
622
|
-
/** All built-in and custom scalars, mapped to their actual values */
|
|
623
|
-
export type Scalars = {
|
|
624
|
-
ID: string;
|
|
625
|
-
String: string;
|
|
626
|
-
Boolean: boolean;
|
|
627
|
-
Int: number;
|
|
628
|
-
Float: number;
|
|
629
|
-
DateTime: Date | string;
|
|
630
|
-
};
|
|
631
|
-
|
|
632
|
-
export type Query = {
|
|
633
|
-
__typename: 'Query';
|
|
634
|
-
me?: Maybe<User>;
|
|
635
|
-
};
|
|
636
|
-
|
|
637
|
-
export type User = {
|
|
638
|
-
__typename: 'User';
|
|
639
|
-
accountGitHub?: Maybe<Scalars['String']>;
|
|
640
|
-
accountGoogle?: Maybe<Scalars['String']>;
|
|
641
|
-
createdAt: Scalars['DateTime'];
|
|
642
|
-
fullName: Scalars['String'];
|
|
643
|
-
id: Scalars['ID'];
|
|
644
|
-
role: UserRole;
|
|
645
|
-
};
|
|
646
|
-
|
|
647
|
-
export type UserRole = 'ADMIN' | 'USER';
|
|
648
|
-
|
|
649
|
-
export type ResolverTypeWrapper<T> = Promise<T> | T;
|
|
650
|
-
|
|
651
|
-
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
|
|
652
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
653
|
-
};
|
|
654
|
-
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
|
|
655
|
-
| ResolverFn<TResult, TParent, TContext, TArgs>
|
|
656
|
-
| ResolverWithResolve<TResult, TParent, TContext, TArgs>;
|
|
657
|
-
|
|
658
|
-
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
|
|
659
|
-
parent: TParent,
|
|
660
|
-
args: TArgs,
|
|
661
|
-
context: TContext,
|
|
662
|
-
info: any
|
|
663
|
-
) => Promise<TResult> | TResult;
|
|
664
|
-
|
|
665
|
-
/** Mapping between all available schema types and the resolvers types */
|
|
666
|
-
export type ResolversTypes = {
|
|
667
|
-
DateTime: ResolverTypeWrapper<Scalars['DateTime']>;
|
|
668
|
-
Query: ResolverTypeWrapper<{}>;
|
|
669
|
-
User: ResolverTypeWrapper<UserMapper>;
|
|
670
|
-
String: ResolverTypeWrapper<Scalars['String']>;
|
|
671
|
-
ID: ResolverTypeWrapper<Scalars['ID']>;
|
|
672
|
-
UserRole: UserRole;
|
|
673
|
-
Boolean: ResolverTypeWrapper<Scalars['Boolean']>;
|
|
674
|
-
};
|
|
675
|
-
|
|
676
|
-
/** Mapping between all available schema types and the resolvers parents */
|
|
677
|
-
export type ResolversParentTypes = {
|
|
678
|
-
DateTime: Scalars['DateTime'];
|
|
679
|
-
Query: {};
|
|
680
|
-
User: UserMapper;
|
|
681
|
-
String: Scalars['String'];
|
|
682
|
-
ID: Scalars['ID'];
|
|
683
|
-
Boolean: Scalars['Boolean'];
|
|
684
|
-
};
|
|
685
|
-
|
|
686
|
-
export type UserResolvers<
|
|
687
|
-
ContextType = any,
|
|
688
|
-
ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']
|
|
689
|
-
> = {
|
|
690
|
-
accountGitHub?: Resolver<
|
|
691
|
-
Maybe<ResolversTypes['String']>,
|
|
692
|
-
ParentType,
|
|
693
|
-
ContextType
|
|
694
|
-
>;
|
|
695
|
-
accountGoogle?: Resolver<
|
|
696
|
-
Maybe<ResolversTypes['String']>,
|
|
697
|
-
ParentType,
|
|
698
|
-
ContextType
|
|
699
|
-
>;
|
|
700
|
-
createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>;
|
|
701
|
-
fullName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
|
702
|
-
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
|
|
703
|
-
role?: Resolver<ResolversTypes['UserRole'], ParentType, ContextType>;
|
|
704
|
-
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
|
705
|
-
};
|
|
706
|
-
`
|
|
707
|
-
);
|
|
708
|
-
|
|
709
|
-
const addedPropertyAssignmentNodes: AddedPropertyAssignmentNodes = {};
|
|
710
|
-
const sourceFile = project.createSourceFile(
|
|
711
|
-
createFilePath('User.ts'),
|
|
712
|
-
`import type { UserResolvers } from './types.generated';
|
|
713
|
-
export const User: UserResolvers = {
|
|
714
|
-
/* Implement logic here */
|
|
715
|
-
};`
|
|
716
|
-
);
|
|
717
|
-
const resolverFile: ObjectTypeFile = {
|
|
718
|
-
__filetype: 'objectType',
|
|
719
|
-
content: '',
|
|
720
|
-
mainImportIdentifier: 'User',
|
|
721
|
-
filesystem: {
|
|
722
|
-
type: 'filesystem',
|
|
723
|
-
contentUpdated: false,
|
|
724
|
-
},
|
|
725
|
-
meta: {
|
|
726
|
-
moduleName: 'user',
|
|
727
|
-
relativePathFromBaseToModule: ['user'],
|
|
728
|
-
normalizedResolverName: {
|
|
729
|
-
base: 'User',
|
|
730
|
-
withModule: 'user.User',
|
|
731
|
-
},
|
|
732
|
-
resolverTypeImportDeclaration: '',
|
|
733
|
-
variableStatement: '',
|
|
734
|
-
resolverType: {
|
|
735
|
-
baseImport: 'UserResolvers',
|
|
736
|
-
final: 'UserResolvers',
|
|
737
|
-
otherVariants: [],
|
|
738
|
-
},
|
|
739
|
-
resolversToGenerate: {
|
|
740
|
-
id: {
|
|
741
|
-
resolverName: 'id',
|
|
742
|
-
resolverDeclaration: `({ id }) => id`,
|
|
743
|
-
},
|
|
744
|
-
accountGitHub: {
|
|
745
|
-
resolverName: 'accountGitHub',
|
|
746
|
-
resolverDeclaration: `({ accountGitHub }) => accountGitHub`,
|
|
747
|
-
},
|
|
748
|
-
accountGoogle: {
|
|
749
|
-
resolverName: 'accountGoogle',
|
|
750
|
-
resolverDeclaration: `({ accountGoogle }) => accountGoogle`,
|
|
751
|
-
},
|
|
752
|
-
fullName: {
|
|
753
|
-
resolverName: 'fullName',
|
|
754
|
-
resolverDeclaration: `({ fullName }) => fullName`,
|
|
755
|
-
},
|
|
756
|
-
},
|
|
757
|
-
},
|
|
758
|
-
};
|
|
759
|
-
addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented({
|
|
760
|
-
mode: 'fast',
|
|
761
|
-
addedPropertyAssignmentNodes,
|
|
762
|
-
sourceFile,
|
|
763
|
-
resolverFile,
|
|
764
|
-
});
|
|
765
|
-
|
|
766
|
-
// This is `/path/User.ts` file. We target it this way because the path on windows is different from linux
|
|
767
|
-
const file = Object.values(addedPropertyAssignmentNodes)[0];
|
|
768
|
-
|
|
769
|
-
const addedNode1 = file[4];
|
|
770
|
-
expect(addedNode1.__toBeRemoved).toBe(false);
|
|
771
|
-
expect(addedNode1.node.getText()).toBe('id: ({ id }) => id');
|
|
772
|
-
|
|
773
|
-
const addedNode2 = file[5];
|
|
774
|
-
expect(addedNode2.__toBeRemoved).toBe(false);
|
|
775
|
-
expect(addedNode2.node.getText()).toBe(
|
|
776
|
-
'accountGitHub: ({ accountGitHub }) => accountGitHub'
|
|
777
|
-
);
|
|
778
|
-
|
|
779
|
-
const addedNode3 = file[6];
|
|
780
|
-
expect(addedNode3.__toBeRemoved).toBe(false);
|
|
781
|
-
expect(addedNode3.node.getText()).toBe(
|
|
782
|
-
'accountGoogle: ({ accountGoogle }) => accountGoogle'
|
|
783
|
-
);
|
|
784
|
-
|
|
785
|
-
const addedNode4 = file[7];
|
|
786
|
-
expect(addedNode4.__toBeRemoved).toBe(false);
|
|
787
|
-
expect(addedNode4.node.getText()).toBe(
|
|
788
|
-
'fullName: ({ fullName }) => fullName'
|
|
789
|
-
);
|
|
790
|
-
|
|
791
|
-
expect(sourceFile.getText()).toMatchInlineSnapshot(`
|
|
792
|
-
"import type { UserResolvers } from './types.generated';
|
|
793
|
-
export const User: UserResolvers = {
|
|
794
|
-
/* Implement logic here */
|
|
795
|
-
id: ({ id }) => id,
|
|
796
|
-
accountGitHub: ({ accountGitHub }) => accountGitHub,
|
|
797
|
-
accountGoogle: ({ accountGoogle }) => accountGoogle,
|
|
798
|
-
fullName: ({ fullName }) => fullName
|
|
799
|
-
};"
|
|
800
|
-
`);
|
|
801
|
-
});
|
|
802
|
-
|
|
803
|
-
it('adds does not add missing field resolvers if not needed i.e. resolversToGenerate is {}', () => {
|
|
804
|
-
const project = new Project();
|
|
805
|
-
project.createSourceFile(
|
|
806
|
-
createFilePath('user.mappers.ts'),
|
|
807
|
-
`export interface UserMapper {
|
|
808
|
-
id: number;
|
|
809
|
-
fullName: string;
|
|
810
|
-
role: 'ADMIN' | 'USER';
|
|
811
|
-
createdAt: Date;
|
|
812
|
-
}`
|
|
813
|
-
);
|
|
814
|
-
project.createSourceFile(
|
|
815
|
-
createFilePath('types.generated.ts'),
|
|
816
|
-
`
|
|
817
|
-
import { UserMapper } from './user.mappers';
|
|
818
|
-
export type Maybe<T> = T | null;
|
|
819
|
-
export type InputMaybe<T> = Maybe<T>;
|
|
820
|
-
export type Exact<T extends { [key: string]: unknown }> = {
|
|
821
|
-
[K in keyof T]: T[K];
|
|
822
|
-
};
|
|
823
|
-
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
|
|
824
|
-
[SubKey in K]?: Maybe<T[SubKey]>;
|
|
825
|
-
};
|
|
826
|
-
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
|
|
827
|
-
[SubKey in K]: Maybe<T[SubKey]>;
|
|
828
|
-
};
|
|
829
|
-
/** All built-in and custom scalars, mapped to their actual values */
|
|
830
|
-
export type Scalars = {
|
|
831
|
-
ID: string;
|
|
832
|
-
String: string;
|
|
833
|
-
Boolean: boolean;
|
|
834
|
-
Int: number;
|
|
835
|
-
Float: number;
|
|
836
|
-
DateTime: Date | string;
|
|
837
|
-
};
|
|
838
|
-
|
|
839
|
-
export type Query = {
|
|
840
|
-
__typename: 'Query';
|
|
841
|
-
me?: Maybe<User>;
|
|
842
|
-
};
|
|
843
|
-
|
|
844
|
-
export type User = {
|
|
845
|
-
__typename: 'User';
|
|
846
|
-
accountGitHub?: Maybe<Scalars['String']>;
|
|
847
|
-
accountGoogle?: Maybe<Scalars['String']>;
|
|
848
|
-
createdAt: Scalars['DateTime'];
|
|
849
|
-
fullName: Scalars['String'];
|
|
850
|
-
id: Scalars['ID'];
|
|
851
|
-
role: UserRole;
|
|
852
|
-
};
|
|
853
|
-
|
|
854
|
-
export type UserRole = 'ADMIN' | 'USER';
|
|
855
|
-
|
|
856
|
-
export type ResolverTypeWrapper<T> = Promise<T> | T;
|
|
857
|
-
|
|
858
|
-
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
|
|
859
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
860
|
-
};
|
|
861
|
-
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
|
|
862
|
-
| ResolverFn<TResult, TParent, TContext, TArgs>
|
|
863
|
-
| ResolverWithResolve<TResult, TParent, TContext, TArgs>;
|
|
864
|
-
|
|
865
|
-
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
|
|
866
|
-
parent: TParent,
|
|
867
|
-
args: TArgs,
|
|
868
|
-
context: TContext,
|
|
869
|
-
info: any
|
|
870
|
-
) => Promise<TResult> | TResult;
|
|
871
|
-
|
|
872
|
-
/** Mapping between all available schema types and the resolvers types */
|
|
873
|
-
export type ResolversTypes = {
|
|
874
|
-
DateTime: ResolverTypeWrapper<Scalars['DateTime']>;
|
|
875
|
-
Query: ResolverTypeWrapper<{}>;
|
|
876
|
-
User: ResolverTypeWrapper<UserMapper>;
|
|
877
|
-
String: ResolverTypeWrapper<Scalars['String']>;
|
|
878
|
-
ID: ResolverTypeWrapper<Scalars['ID']>;
|
|
879
|
-
UserRole: UserRole;
|
|
880
|
-
Boolean: ResolverTypeWrapper<Scalars['Boolean']>;
|
|
881
|
-
};
|
|
882
|
-
|
|
883
|
-
/** Mapping between all available schema types and the resolvers parents */
|
|
884
|
-
export type ResolversParentTypes = {
|
|
885
|
-
DateTime: Scalars['DateTime'];
|
|
886
|
-
Query: {};
|
|
887
|
-
User: UserMapper;
|
|
888
|
-
String: Scalars['String'];
|
|
889
|
-
ID: Scalars['ID'];
|
|
890
|
-
Boolean: Scalars['Boolean'];
|
|
891
|
-
};
|
|
892
|
-
|
|
893
|
-
export type UserResolvers<
|
|
894
|
-
ContextType = any,
|
|
895
|
-
ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']
|
|
896
|
-
> = {
|
|
897
|
-
accountGitHub?: Resolver<
|
|
898
|
-
Maybe<ResolversTypes['String']>,
|
|
899
|
-
ParentType,
|
|
900
|
-
ContextType
|
|
901
|
-
>;
|
|
902
|
-
accountGoogle?: Resolver<
|
|
903
|
-
Maybe<ResolversTypes['String']>,
|
|
904
|
-
ParentType,
|
|
905
|
-
ContextType
|
|
906
|
-
>;
|
|
907
|
-
createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>;
|
|
908
|
-
fullName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
|
909
|
-
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
|
|
910
|
-
role?: Resolver<ResolversTypes['UserRole'], ParentType, ContextType>;
|
|
911
|
-
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
|
912
|
-
};
|
|
913
|
-
`
|
|
914
|
-
);
|
|
915
|
-
|
|
916
|
-
const addedPropertyAssignmentNodes: AddedPropertyAssignmentNodes = {};
|
|
917
|
-
const sourceFile = project.createSourceFile(
|
|
918
|
-
createFilePath('User.ts'),
|
|
919
|
-
`import type { UserResolvers } from './types.generated';
|
|
920
|
-
export const User: UserResolvers = {};`
|
|
921
|
-
);
|
|
922
|
-
const resolverFile: ObjectTypeFile = {
|
|
923
|
-
__filetype: 'objectType',
|
|
924
|
-
content: '',
|
|
925
|
-
mainImportIdentifier: 'User',
|
|
926
|
-
filesystem: {
|
|
927
|
-
type: 'filesystem',
|
|
928
|
-
contentUpdated: false,
|
|
929
|
-
},
|
|
930
|
-
meta: {
|
|
931
|
-
moduleName: 'user',
|
|
932
|
-
relativePathFromBaseToModule: ['user'],
|
|
933
|
-
normalizedResolverName: {
|
|
934
|
-
base: 'User',
|
|
935
|
-
withModule: 'user.User',
|
|
936
|
-
},
|
|
937
|
-
resolverTypeImportDeclaration: '',
|
|
938
|
-
variableStatement: '',
|
|
939
|
-
resolverType: {
|
|
940
|
-
baseImport: 'UserResolvers',
|
|
941
|
-
final: 'UserResolvers',
|
|
942
|
-
otherVariants: [],
|
|
943
|
-
},
|
|
944
|
-
resolversToGenerate: {},
|
|
945
|
-
},
|
|
946
|
-
};
|
|
947
|
-
addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented({
|
|
948
|
-
mode: 'fast',
|
|
949
|
-
addedPropertyAssignmentNodes,
|
|
950
|
-
sourceFile,
|
|
951
|
-
resolverFile,
|
|
952
|
-
});
|
|
953
|
-
|
|
954
|
-
// This is `/path/User.ts` file. We target it this way because the path on windows is different from linux
|
|
955
|
-
const file = Object.values(addedPropertyAssignmentNodes)[0];
|
|
956
|
-
|
|
957
|
-
expect(file).toEqual({});
|
|
958
|
-
expect(sourceFile.getText()).toMatchInlineSnapshot(`
|
|
959
|
-
"import type { UserResolvers } from './types.generated';
|
|
960
|
-
export const User: UserResolvers = {};"
|
|
961
|
-
`);
|
|
962
|
-
});
|
|
963
|
-
|
|
964
|
-
it('adds missing field resolvers, if necessary, when Mapper is a Class', () => {
|
|
965
|
-
const project = new Project();
|
|
966
|
-
project.createSourceFile(
|
|
967
|
-
createFilePath('user.mappers.ts'),
|
|
968
|
-
`export class UserMapper {
|
|
969
|
-
id: number;
|
|
970
|
-
firstName: string;
|
|
971
|
-
lastName: string;
|
|
972
|
-
role: 'ADMIN' | 'USER';
|
|
973
|
-
createdAt: Date;
|
|
974
|
-
}`
|
|
975
|
-
);
|
|
976
|
-
project.createSourceFile(
|
|
977
|
-
createFilePath('types.generated.ts'),
|
|
978
|
-
`
|
|
979
|
-
import { UserMapper } from './user.mappers';
|
|
980
|
-
export type Maybe<T> = T | null;
|
|
981
|
-
export type InputMaybe<T> = Maybe<T>;
|
|
982
|
-
export type Exact<T extends { [key: string]: unknown }> = {
|
|
983
|
-
[K in keyof T]: T[K];
|
|
984
|
-
};
|
|
985
|
-
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
|
|
986
|
-
[SubKey in K]?: Maybe<T[SubKey]>;
|
|
987
|
-
};
|
|
988
|
-
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
|
|
989
|
-
[SubKey in K]: Maybe<T[SubKey]>;
|
|
990
|
-
};
|
|
991
|
-
/** All built-in and custom scalars, mapped to their actual values */
|
|
992
|
-
export type Scalars = {
|
|
993
|
-
ID: string;
|
|
994
|
-
String: string;
|
|
995
|
-
Boolean: boolean;
|
|
996
|
-
Int: number;
|
|
997
|
-
Float: number;
|
|
998
|
-
DateTime: Date | string;
|
|
999
|
-
};
|
|
1000
|
-
|
|
1001
|
-
export type Query = {
|
|
1002
|
-
__typename: 'Query';
|
|
1003
|
-
me?: Maybe<User>;
|
|
1004
|
-
};
|
|
1005
|
-
|
|
1006
|
-
export type User = {
|
|
1007
|
-
__typename: 'User';
|
|
1008
|
-
accountGitHub?: Maybe<Scalars['String']>;
|
|
1009
|
-
accountGoogle?: Maybe<Scalars['String']>;
|
|
1010
|
-
createdAt: Scalars['DateTime'];
|
|
1011
|
-
fullName: Scalars['String'];
|
|
1012
|
-
id: Scalars['ID'];
|
|
1013
|
-
role: UserRole;
|
|
1014
|
-
};
|
|
1015
|
-
|
|
1016
|
-
export type UserRole = 'ADMIN' | 'USER';
|
|
1017
|
-
|
|
1018
|
-
export type ResolverTypeWrapper<T> = Promise<T> | T;
|
|
1019
|
-
|
|
1020
|
-
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
|
|
1021
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
1022
|
-
};
|
|
1023
|
-
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
|
|
1024
|
-
| ResolverFn<TResult, TParent, TContext, TArgs>
|
|
1025
|
-
| ResolverWithResolve<TResult, TParent, TContext, TArgs>;
|
|
1026
|
-
|
|
1027
|
-
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
|
|
1028
|
-
parent: TParent,
|
|
1029
|
-
args: TArgs,
|
|
1030
|
-
context: TContext,
|
|
1031
|
-
info: any
|
|
1032
|
-
) => Promise<TResult> | TResult;
|
|
1033
|
-
|
|
1034
|
-
/** Mapping between all available schema types and the resolvers types */
|
|
1035
|
-
export type ResolversTypes = {
|
|
1036
|
-
DateTime: ResolverTypeWrapper<Scalars['DateTime']>;
|
|
1037
|
-
Query: ResolverTypeWrapper<{}>;
|
|
1038
|
-
User: ResolverTypeWrapper<UserMapper>;
|
|
1039
|
-
String: ResolverTypeWrapper<Scalars['String']>;
|
|
1040
|
-
ID: ResolverTypeWrapper<Scalars['ID']>;
|
|
1041
|
-
UserRole: UserRole;
|
|
1042
|
-
Boolean: ResolverTypeWrapper<Scalars['Boolean']>;
|
|
1043
|
-
};
|
|
1044
|
-
|
|
1045
|
-
/** Mapping between all available schema types and the resolvers parents */
|
|
1046
|
-
export type ResolversParentTypes = {
|
|
1047
|
-
DateTime: Scalars['DateTime'];
|
|
1048
|
-
Query: {};
|
|
1049
|
-
User: UserMapper;
|
|
1050
|
-
String: Scalars['String'];
|
|
1051
|
-
ID: Scalars['ID'];
|
|
1052
|
-
Boolean: Scalars['Boolean'];
|
|
1053
|
-
};
|
|
1054
|
-
|
|
1055
|
-
export type UserResolvers<
|
|
1056
|
-
ContextType = any,
|
|
1057
|
-
ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']
|
|
1058
|
-
> = {
|
|
1059
|
-
accountGitHub?: Resolver<
|
|
1060
|
-
Maybe<ResolversTypes['String']>,
|
|
1061
|
-
ParentType,
|
|
1062
|
-
ContextType
|
|
1063
|
-
>;
|
|
1064
|
-
accountGoogle?: Resolver<
|
|
1065
|
-
Maybe<ResolversTypes['String']>,
|
|
1066
|
-
ParentType,
|
|
1067
|
-
ContextType
|
|
1068
|
-
>;
|
|
1069
|
-
createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>;
|
|
1070
|
-
fullName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
|
1071
|
-
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
|
|
1072
|
-
role?: Resolver<ResolversTypes['UserRole'], ParentType, ContextType>;
|
|
1073
|
-
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
|
1074
|
-
};
|
|
1075
|
-
`
|
|
1076
|
-
);
|
|
1077
|
-
|
|
1078
|
-
const sourceFile = project.createSourceFile(
|
|
1079
|
-
createFilePath('User.ts'),
|
|
1080
|
-
`import type { UserResolvers } from './types.generated';
|
|
1081
|
-
export const User: UserResolvers = {
|
|
1082
|
-
/* Implement logic here */
|
|
1083
|
-
};`
|
|
1084
|
-
);
|
|
1085
|
-
const resolverFile: Parameters<
|
|
1086
|
-
typeof addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented
|
|
1087
|
-
>[0]['resolverFile'] = {
|
|
1088
|
-
__filetype: 'objectType',
|
|
1089
|
-
content: '',
|
|
1090
|
-
filesystem: {
|
|
1091
|
-
type: 'filesystem',
|
|
1092
|
-
contentUpdated: false,
|
|
1093
|
-
},
|
|
1094
|
-
mainImportIdentifier: 'User',
|
|
1095
|
-
meta: {
|
|
1096
|
-
moduleName: 'user',
|
|
1097
|
-
relativePathFromBaseToModule: ['user'],
|
|
1098
|
-
normalizedResolverName: {
|
|
1099
|
-
base: 'User',
|
|
1100
|
-
withModule: 'user.User',
|
|
1101
|
-
},
|
|
1102
|
-
resolverTypeImportDeclaration: '',
|
|
1103
|
-
variableStatement: '',
|
|
1104
|
-
resolverType: {
|
|
1105
|
-
baseImport: 'UserResolvers',
|
|
1106
|
-
final: 'UserResolvers',
|
|
1107
|
-
otherVariants: [],
|
|
1108
|
-
},
|
|
1109
|
-
resolversToGenerate: {
|
|
1110
|
-
id: {
|
|
1111
|
-
resolverName: 'id',
|
|
1112
|
-
resolverDeclaration: `({ id }) => id`,
|
|
1113
|
-
},
|
|
1114
|
-
accountGitHub: {
|
|
1115
|
-
resolverName: 'accountGitHub',
|
|
1116
|
-
resolverDeclaration: `({ accountGitHub }) => accountGitHub`,
|
|
1117
|
-
},
|
|
1118
|
-
accountGoogle: {
|
|
1119
|
-
resolverName: 'accountGoogle',
|
|
1120
|
-
resolverDeclaration: `({ accountGoogle }) => accountGoogle`,
|
|
1121
|
-
},
|
|
1122
|
-
fullName: {
|
|
1123
|
-
resolverName: 'fullName',
|
|
1124
|
-
resolverDeclaration: `({ fullName }) => fullName`,
|
|
1125
|
-
},
|
|
1126
|
-
},
|
|
1127
|
-
},
|
|
1128
|
-
};
|
|
1129
|
-
|
|
1130
|
-
const addedPropertyAssignmentNodes: AddedPropertyAssignmentNodes = {};
|
|
1131
|
-
addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented({
|
|
1132
|
-
mode: 'fast',
|
|
1133
|
-
addedPropertyAssignmentNodes,
|
|
1134
|
-
sourceFile,
|
|
1135
|
-
resolverFile,
|
|
1136
|
-
});
|
|
1137
|
-
|
|
1138
|
-
// This is `/path/User.ts` file. We target it this way because the path on windows is different from linux
|
|
1139
|
-
const file = Object.values(addedPropertyAssignmentNodes)[0];
|
|
1140
|
-
|
|
1141
|
-
const addedNode1 = file[4];
|
|
1142
|
-
expect(addedNode1.__toBeRemoved).toBe(false);
|
|
1143
|
-
expect(addedNode1.node.getText()).toBe('id: ({ id }) => id');
|
|
1144
|
-
|
|
1145
|
-
const addedNode2 = file[5];
|
|
1146
|
-
expect(addedNode2.__toBeRemoved).toBe(false);
|
|
1147
|
-
expect(addedNode2.node.getText()).toBe(
|
|
1148
|
-
'accountGitHub: ({ accountGitHub }) => accountGitHub'
|
|
1149
|
-
);
|
|
1150
|
-
|
|
1151
|
-
const addedNode3 = file[6];
|
|
1152
|
-
expect(addedNode3.__toBeRemoved).toBe(false);
|
|
1153
|
-
expect(addedNode3.node.getText()).toBe(
|
|
1154
|
-
'accountGoogle: ({ accountGoogle }) => accountGoogle'
|
|
1155
|
-
);
|
|
1156
|
-
|
|
1157
|
-
const addedNode4 = file[7];
|
|
1158
|
-
expect(addedNode4.__toBeRemoved).toBe(false);
|
|
1159
|
-
expect(addedNode4.node.getText()).toBe(
|
|
1160
|
-
'fullName: ({ fullName }) => fullName'
|
|
1161
|
-
);
|
|
1162
|
-
|
|
1163
|
-
expect(sourceFile.getText()).toMatchInlineSnapshot(`
|
|
1164
|
-
"import type { UserResolvers } from './types.generated';
|
|
1165
|
-
export const User: UserResolvers = {
|
|
1166
|
-
/* Implement logic here */
|
|
1167
|
-
id: ({ id }) => id,
|
|
1168
|
-
accountGitHub: ({ accountGitHub }) => accountGitHub,
|
|
1169
|
-
accountGoogle: ({ accountGoogle }) => accountGoogle,
|
|
1170
|
-
fullName: ({ fullName }) => fullName
|
|
1171
|
-
};"
|
|
1172
|
-
`);
|
|
1173
|
-
});
|
|
1174
|
-
});
|