@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,531 +0,0 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import {
|
|
4
|
-
type GraphQLField,
|
|
5
|
-
type GraphQLScalarType,
|
|
6
|
-
type GraphQLSchema,
|
|
7
|
-
type GraphQLObjectType,
|
|
8
|
-
type Location,
|
|
9
|
-
isObjectType,
|
|
10
|
-
isScalarType,
|
|
11
|
-
isSpecifiedScalarType,
|
|
12
|
-
isUnionType,
|
|
13
|
-
isInterfaceType,
|
|
14
|
-
isEnumType,
|
|
15
|
-
} from 'graphql';
|
|
16
|
-
import type { ParseSourcesResult } from '../parseSources/index.js';
|
|
17
|
-
import type { TypeMappersMap } from '../parseTypeMappers/index.js';
|
|
18
|
-
import type {
|
|
19
|
-
ParsedPresetConfig,
|
|
20
|
-
ScalarsOverridesType,
|
|
21
|
-
} from '../validatePresetConfig/index.js';
|
|
22
|
-
import {
|
|
23
|
-
logger,
|
|
24
|
-
isNativeNamedType,
|
|
25
|
-
isRootObjectType,
|
|
26
|
-
relativeModulePath,
|
|
27
|
-
type RootObjectType,
|
|
28
|
-
} from '../utils/index.js';
|
|
29
|
-
import { parseLocationForOutputDir } from './parseLocationForOutputDir.js';
|
|
30
|
-
import { normalizeResolverName } from './normalizeResolverName.js';
|
|
31
|
-
import type { GeneratedTypesFileMeta } from '../generateResolverFiles/index.js';
|
|
32
|
-
|
|
33
|
-
interface ParseGraphQLSchemaParams {
|
|
34
|
-
schemaAst: GraphQLSchema;
|
|
35
|
-
sourceMap: ParseSourcesResult['sourceMap'];
|
|
36
|
-
resolverTypesPath: string;
|
|
37
|
-
typeMappersMap: TypeMappersMap;
|
|
38
|
-
scalarsModule: ParsedPresetConfig['scalarsModule'];
|
|
39
|
-
scalarsOverrides: ParsedPresetConfig['scalarsOverrides'];
|
|
40
|
-
mode: ParsedPresetConfig['mode'];
|
|
41
|
-
baseOutputDir: string;
|
|
42
|
-
resolverRelativeTargetDir: string;
|
|
43
|
-
whitelistedModules: ParsedPresetConfig['whitelistedModules'];
|
|
44
|
-
blacklistedModules: ParsedPresetConfig['blacklistedModules'];
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface ResolverDetails {
|
|
48
|
-
schemaType: string;
|
|
49
|
-
moduleName: string;
|
|
50
|
-
resolverFile: {
|
|
51
|
-
name: string;
|
|
52
|
-
path: string;
|
|
53
|
-
isOnFilesystem: boolean;
|
|
54
|
-
};
|
|
55
|
-
relativePathFromBaseToModule: string[];
|
|
56
|
-
normalizedResolverName: ReturnType<typeof normalizeResolverName>;
|
|
57
|
-
typeNamedImport: (generatedTypesFileMeta: GeneratedTypesFileMeta) => string;
|
|
58
|
-
typeString: (generatedTypesFileMeta: GeneratedTypesFileMeta) => string;
|
|
59
|
-
relativePathToResolverTypesFile: string;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
type ObjectResolverDetails = ResolverDetails & {
|
|
63
|
-
fieldsToPick: string[];
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
type EnumResolverDetails = ResolverDetails & {
|
|
67
|
-
allowedValues: string[];
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
export interface ParsedGraphQLSchemaMeta {
|
|
71
|
-
userDefinedSchemaTypeMap: {
|
|
72
|
-
query: Record<
|
|
73
|
-
string, // normalized resolver name
|
|
74
|
-
ResolverDetails
|
|
75
|
-
>;
|
|
76
|
-
mutation: Record<
|
|
77
|
-
string, // normalized resolver name
|
|
78
|
-
ResolverDetails
|
|
79
|
-
>;
|
|
80
|
-
subscription: Record<
|
|
81
|
-
string, // normalized resolver name
|
|
82
|
-
ResolverDetails
|
|
83
|
-
>;
|
|
84
|
-
object: Record<
|
|
85
|
-
string, // schema name e.g. `User`, `Job`, etc.
|
|
86
|
-
Record<
|
|
87
|
-
string, // normalized name e.g. `user.User` (modules) or `.User` (merged)
|
|
88
|
-
ObjectResolverDetails
|
|
89
|
-
>
|
|
90
|
-
>;
|
|
91
|
-
scalar: Record<string, ResolverDetails>;
|
|
92
|
-
interface: Record<string, ResolverDetails>;
|
|
93
|
-
union: Record<string, ResolverDetails>;
|
|
94
|
-
enum: Record<string, EnumResolverDetails>;
|
|
95
|
-
};
|
|
96
|
-
pluginsConfig: {
|
|
97
|
-
defaultScalarTypesMap: Record<string, ScalarsOverridesType>;
|
|
98
|
-
scalarsModuleResolvers: Record<string, string>;
|
|
99
|
-
unmanagedScalarResolvers: Record<string, string>;
|
|
100
|
-
defaultTypeMappers: Record<string, string>;
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export const parseGraphQLSchema = async ({
|
|
105
|
-
schemaAst,
|
|
106
|
-
sourceMap,
|
|
107
|
-
resolverTypesPath,
|
|
108
|
-
typeMappersMap,
|
|
109
|
-
scalarsModule,
|
|
110
|
-
scalarsOverrides,
|
|
111
|
-
mode,
|
|
112
|
-
baseOutputDir,
|
|
113
|
-
resolverRelativeTargetDir,
|
|
114
|
-
whitelistedModules,
|
|
115
|
-
blacklistedModules,
|
|
116
|
-
}: ParseGraphQLSchemaParams): Promise<ParsedGraphQLSchemaMeta> => {
|
|
117
|
-
const scalarsModuleResolverMap = scalarsModule
|
|
118
|
-
? await getScalarResolverMapFromModule(scalarsModule)
|
|
119
|
-
: {};
|
|
120
|
-
|
|
121
|
-
return Object.entries(schemaAst.getTypeMap()).reduce<ParsedGraphQLSchemaMeta>(
|
|
122
|
-
(res, [schemaType, namedType]) => {
|
|
123
|
-
if (isNativeNamedType(namedType)) {
|
|
124
|
-
if (isSpecifiedScalarType(namedType)) {
|
|
125
|
-
handleNativeScalarType({ schemaType, result: res, scalarsOverrides });
|
|
126
|
-
}
|
|
127
|
-
return res;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Root object types e.g. Query, Mutation, Subscription
|
|
131
|
-
if (isRootObjectType(schemaType) && isObjectType(namedType)) {
|
|
132
|
-
Object.entries(namedType.getFields()).forEach(
|
|
133
|
-
([fieldName, fieldNode]) => {
|
|
134
|
-
const resolverDetails = createResolverDetails({
|
|
135
|
-
belongsToRootObject: schemaType,
|
|
136
|
-
mode,
|
|
137
|
-
sourceMap,
|
|
138
|
-
resolverRelativeTargetDir,
|
|
139
|
-
resolverTypesPath,
|
|
140
|
-
baseOutputDir,
|
|
141
|
-
blacklistedModules,
|
|
142
|
-
whitelistedModules,
|
|
143
|
-
schemaType,
|
|
144
|
-
nestedDirs: [schemaType],
|
|
145
|
-
location: fieldNode.astNode?.loc,
|
|
146
|
-
resolverName: fieldName,
|
|
147
|
-
});
|
|
148
|
-
if (!resolverDetails) {
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
res.userDefinedSchemaTypeMap[
|
|
153
|
-
schemaType.toLowerCase() as 'query' | 'mutation' | 'subscription'
|
|
154
|
-
][resolverDetails.normalizedResolverName.withModule] =
|
|
155
|
-
resolverDetails;
|
|
156
|
-
}
|
|
157
|
-
);
|
|
158
|
-
return res;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Wire up `mappers` config:
|
|
162
|
-
// - Interface
|
|
163
|
-
// - Enum
|
|
164
|
-
// - Non-root object types
|
|
165
|
-
if (
|
|
166
|
-
isInterfaceType(namedType) ||
|
|
167
|
-
isEnumType(namedType) ||
|
|
168
|
-
(!isRootObjectType(schemaType) && isObjectType(namedType))
|
|
169
|
-
) {
|
|
170
|
-
const typeMapperDetails = typeMappersMap[schemaType];
|
|
171
|
-
if (typeMapperDetails) {
|
|
172
|
-
res.pluginsConfig.defaultTypeMappers[typeMapperDetails.schemaType] =
|
|
173
|
-
typeMapperDetails.configImportPath;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Other output object types
|
|
178
|
-
if (!isRootObjectType(schemaType) && isObjectType(namedType)) {
|
|
179
|
-
handleObjectType({
|
|
180
|
-
mode,
|
|
181
|
-
sourceMap,
|
|
182
|
-
resolverTypesPath,
|
|
183
|
-
resolverRelativeTargetDir,
|
|
184
|
-
baseOutputDir,
|
|
185
|
-
blacklistedModules,
|
|
186
|
-
whitelistedModules,
|
|
187
|
-
namedType,
|
|
188
|
-
schemaType,
|
|
189
|
-
result: res,
|
|
190
|
-
});
|
|
191
|
-
return res;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Handle scalar type wireups
|
|
195
|
-
if (isScalarType(namedType)) {
|
|
196
|
-
handleScalarType({
|
|
197
|
-
scalarsModuleResolverMap,
|
|
198
|
-
schemaType,
|
|
199
|
-
scalarsModule,
|
|
200
|
-
scalarsOverrides,
|
|
201
|
-
result: res,
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// create resolver details for other types:
|
|
206
|
-
// - Scalar
|
|
207
|
-
// - Union
|
|
208
|
-
// - Interface
|
|
209
|
-
// - Enum
|
|
210
|
-
const resolverDetails = createResolverDetails({
|
|
211
|
-
belongsToRootObject: null,
|
|
212
|
-
mode,
|
|
213
|
-
sourceMap,
|
|
214
|
-
resolverRelativeTargetDir,
|
|
215
|
-
resolverTypesPath,
|
|
216
|
-
baseOutputDir,
|
|
217
|
-
blacklistedModules,
|
|
218
|
-
whitelistedModules,
|
|
219
|
-
schemaType,
|
|
220
|
-
nestedDirs: [],
|
|
221
|
-
location: namedType.astNode?.loc,
|
|
222
|
-
resolverName: namedType.name,
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
if (resolverDetails) {
|
|
226
|
-
if (isScalarType(namedType)) {
|
|
227
|
-
res.userDefinedSchemaTypeMap.scalar[schemaType] = resolverDetails;
|
|
228
|
-
} else if (isUnionType(namedType)) {
|
|
229
|
-
res.userDefinedSchemaTypeMap.union[schemaType] = resolverDetails;
|
|
230
|
-
} else if (isInterfaceType(namedType)) {
|
|
231
|
-
res.userDefinedSchemaTypeMap.interface[schemaType] = resolverDetails;
|
|
232
|
-
} else if (isEnumType(namedType)) {
|
|
233
|
-
res.userDefinedSchemaTypeMap.enum[schemaType] = {
|
|
234
|
-
...resolverDetails,
|
|
235
|
-
allowedValues:
|
|
236
|
-
namedType.astNode?.values?.map((v) => v.name.value) || [],
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return res;
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
userDefinedSchemaTypeMap: {
|
|
245
|
-
query: {},
|
|
246
|
-
mutation: {},
|
|
247
|
-
subscription: {},
|
|
248
|
-
object: {},
|
|
249
|
-
scalar: {},
|
|
250
|
-
interface: {},
|
|
251
|
-
union: {},
|
|
252
|
-
enum: {},
|
|
253
|
-
},
|
|
254
|
-
pluginsConfig: {
|
|
255
|
-
defaultScalarTypesMap: {},
|
|
256
|
-
scalarsModuleResolvers: {},
|
|
257
|
-
unmanagedScalarResolvers: {},
|
|
258
|
-
defaultTypeMappers: {},
|
|
259
|
-
},
|
|
260
|
-
}
|
|
261
|
-
);
|
|
262
|
-
};
|
|
263
|
-
|
|
264
|
-
const handleScalarType = ({
|
|
265
|
-
scalarsModuleResolverMap,
|
|
266
|
-
schemaType,
|
|
267
|
-
scalarsModule,
|
|
268
|
-
scalarsOverrides,
|
|
269
|
-
result,
|
|
270
|
-
}: {
|
|
271
|
-
scalarsModuleResolverMap: Record<string, GraphQLScalarType<unknown, unknown>>;
|
|
272
|
-
schemaType: string;
|
|
273
|
-
scalarsModule: string | false;
|
|
274
|
-
scalarsOverrides: ParsedPresetConfig['scalarsOverrides'];
|
|
275
|
-
result: ParsedGraphQLSchemaMeta;
|
|
276
|
-
}): void => {
|
|
277
|
-
const scalarsModuleResolver = scalarsModuleResolverMap[schemaType];
|
|
278
|
-
// Use found the scalar from scalar module
|
|
279
|
-
if (scalarsModuleResolver) {
|
|
280
|
-
if (
|
|
281
|
-
scalarsModuleResolver.extensions.codegenScalarType &&
|
|
282
|
-
typeof scalarsModuleResolver.extensions.codegenScalarType === 'string'
|
|
283
|
-
) {
|
|
284
|
-
result.pluginsConfig.defaultScalarTypesMap[schemaType] =
|
|
285
|
-
scalarsModuleResolver.extensions.codegenScalarType;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
result.pluginsConfig.scalarsModuleResolvers[
|
|
289
|
-
schemaType
|
|
290
|
-
] = `~${scalarsModule}#${scalarsModuleResolver.name}Resolver`;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// If found scalar overrides, use them
|
|
294
|
-
const override = scalarsOverrides[schemaType];
|
|
295
|
-
if (override) {
|
|
296
|
-
if (override.type) {
|
|
297
|
-
result.pluginsConfig.defaultScalarTypesMap[schemaType] = override.type;
|
|
298
|
-
}
|
|
299
|
-
if (override.resolver) {
|
|
300
|
-
result.pluginsConfig.unmanagedScalarResolvers[schemaType] =
|
|
301
|
-
override.resolver;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
const getScalarResolverMapFromModule = async (
|
|
307
|
-
scalarsModule: string
|
|
308
|
-
): Promise<Record<string, GraphQLScalarType<unknown, unknown>>> => {
|
|
309
|
-
let module:
|
|
310
|
-
| { resolvers: Record<string, GraphQLScalarType<unknown, unknown>> }
|
|
311
|
-
| undefined;
|
|
312
|
-
try {
|
|
313
|
-
module = await import(scalarsModule);
|
|
314
|
-
} catch (err) {
|
|
315
|
-
if (
|
|
316
|
-
err instanceof Error &&
|
|
317
|
-
'code' in err &&
|
|
318
|
-
err.code === 'MODULE_NOT_FOUND'
|
|
319
|
-
) {
|
|
320
|
-
logger.warn(
|
|
321
|
-
`Unable to import \`${scalarsModule}\`. Install \`${scalarsModule}\` or you have to implement Scalar resolvers by yourself.`
|
|
322
|
-
);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
if (!module || !module.resolvers) {
|
|
327
|
-
return {};
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
return module.resolvers;
|
|
331
|
-
};
|
|
332
|
-
|
|
333
|
-
const handleNativeScalarType = ({
|
|
334
|
-
schemaType,
|
|
335
|
-
result,
|
|
336
|
-
scalarsOverrides,
|
|
337
|
-
}: {
|
|
338
|
-
schemaType: string;
|
|
339
|
-
result: ParsedGraphQLSchemaMeta;
|
|
340
|
-
scalarsOverrides: ParsedPresetConfig['scalarsOverrides'];
|
|
341
|
-
}): void => {
|
|
342
|
-
const override = scalarsOverrides[schemaType];
|
|
343
|
-
// Note: only override the type i.e. same functionality as `typescript` plugin's scalars
|
|
344
|
-
// I've never seen someone overriding native scalar's implementation so it's probably not a thing.
|
|
345
|
-
if (override && override.type) {
|
|
346
|
-
result.pluginsConfig.defaultScalarTypesMap[schemaType] = override.type;
|
|
347
|
-
}
|
|
348
|
-
};
|
|
349
|
-
|
|
350
|
-
const handleObjectType = ({
|
|
351
|
-
mode,
|
|
352
|
-
sourceMap,
|
|
353
|
-
resolverTypesPath,
|
|
354
|
-
resolverRelativeTargetDir,
|
|
355
|
-
baseOutputDir,
|
|
356
|
-
blacklistedModules,
|
|
357
|
-
whitelistedModules,
|
|
358
|
-
namedType,
|
|
359
|
-
schemaType,
|
|
360
|
-
result,
|
|
361
|
-
}: {
|
|
362
|
-
mode: ParseGraphQLSchemaParams['mode'];
|
|
363
|
-
sourceMap: ParseGraphQLSchemaParams['sourceMap'];
|
|
364
|
-
resolverTypesPath: ParseGraphQLSchemaParams['resolverTypesPath'];
|
|
365
|
-
resolverRelativeTargetDir: ParseGraphQLSchemaParams['resolverRelativeTargetDir'];
|
|
366
|
-
baseOutputDir: ParseGraphQLSchemaParams['baseOutputDir'];
|
|
367
|
-
blacklistedModules: ParseGraphQLSchemaParams['blacklistedModules'];
|
|
368
|
-
whitelistedModules: ParseGraphQLSchemaParams['whitelistedModules'];
|
|
369
|
-
namedType: GraphQLObjectType;
|
|
370
|
-
schemaType: string;
|
|
371
|
-
result: ParsedGraphQLSchemaMeta;
|
|
372
|
-
}): void => {
|
|
373
|
-
// parse for details
|
|
374
|
-
const fieldsByGraphQLModule = Object.entries(namedType.getFields()).reduce<
|
|
375
|
-
Record<
|
|
376
|
-
string,
|
|
377
|
-
{
|
|
378
|
-
fieldNodes: GraphQLField<unknown, unknown>[];
|
|
379
|
-
firstFieldLocation: Location | undefined;
|
|
380
|
-
}
|
|
381
|
-
>
|
|
382
|
-
>((res, [_, fieldNode]) => {
|
|
383
|
-
const fieldLocation = fieldNode.astNode?.loc;
|
|
384
|
-
const modulePath = path.dirname(fieldLocation?.source.name || '');
|
|
385
|
-
|
|
386
|
-
if (!res[modulePath]) {
|
|
387
|
-
res[modulePath] = {
|
|
388
|
-
fieldNodes: [],
|
|
389
|
-
// Note: fieldLocation here is the location of the first field found in a GraphQL Module.
|
|
390
|
-
// The reason we use field's location instead of the object type's location is because when `extend type ObjectType` is used, the location of object type is the last found location.
|
|
391
|
-
// i.e. we cannot rely on object's location if `extend type` is used.
|
|
392
|
-
firstFieldLocation: fieldLocation,
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
res[modulePath].fieldNodes.push(fieldNode);
|
|
397
|
-
|
|
398
|
-
return res;
|
|
399
|
-
}, {});
|
|
400
|
-
|
|
401
|
-
result.userDefinedSchemaTypeMap.object[schemaType] =
|
|
402
|
-
result.userDefinedSchemaTypeMap.object[schemaType] || {};
|
|
403
|
-
|
|
404
|
-
Object.entries(fieldsByGraphQLModule).forEach(
|
|
405
|
-
(
|
|
406
|
-
[_modulePath, { firstFieldLocation, fieldNodes }],
|
|
407
|
-
_index,
|
|
408
|
-
graphQLModules
|
|
409
|
-
) => {
|
|
410
|
-
const resolverDetails = createResolverDetails({
|
|
411
|
-
belongsToRootObject: null,
|
|
412
|
-
mode,
|
|
413
|
-
sourceMap,
|
|
414
|
-
resolverRelativeTargetDir,
|
|
415
|
-
resolverTypesPath,
|
|
416
|
-
baseOutputDir,
|
|
417
|
-
blacklistedModules,
|
|
418
|
-
whitelistedModules,
|
|
419
|
-
schemaType,
|
|
420
|
-
nestedDirs: [],
|
|
421
|
-
location: firstFieldLocation,
|
|
422
|
-
resolverName: namedType.name,
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
if (!resolverDetails) {
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
// If there are multiple object type files to generate
|
|
430
|
-
// e.g. `extend type ObjectType` is used across multiple modules
|
|
431
|
-
// We create an array of fields to pick for each module
|
|
432
|
-
//
|
|
433
|
-
// If there's only one module, we return an empty array i.e. pick all fields
|
|
434
|
-
const fieldsToPick =
|
|
435
|
-
graphQLModules.length > 1 ? fieldNodes.map((field) => field.name) : [];
|
|
436
|
-
|
|
437
|
-
result.userDefinedSchemaTypeMap.object[schemaType][
|
|
438
|
-
resolverDetails.normalizedResolverName.withModule
|
|
439
|
-
] = {
|
|
440
|
-
...resolverDetails,
|
|
441
|
-
fieldsToPick,
|
|
442
|
-
};
|
|
443
|
-
}
|
|
444
|
-
);
|
|
445
|
-
};
|
|
446
|
-
|
|
447
|
-
const createResolverDetails = ({
|
|
448
|
-
belongsToRootObject,
|
|
449
|
-
mode,
|
|
450
|
-
sourceMap,
|
|
451
|
-
resolverRelativeTargetDir,
|
|
452
|
-
resolverTypesPath,
|
|
453
|
-
baseOutputDir,
|
|
454
|
-
blacklistedModules,
|
|
455
|
-
whitelistedModules,
|
|
456
|
-
schemaType,
|
|
457
|
-
nestedDirs,
|
|
458
|
-
location,
|
|
459
|
-
resolverName,
|
|
460
|
-
}: {
|
|
461
|
-
belongsToRootObject: RootObjectType | null;
|
|
462
|
-
mode: ParseGraphQLSchemaParams['mode'];
|
|
463
|
-
sourceMap: ParseGraphQLSchemaParams['sourceMap'];
|
|
464
|
-
resolverRelativeTargetDir: ParseGraphQLSchemaParams['resolverRelativeTargetDir'];
|
|
465
|
-
resolverTypesPath: ParseGraphQLSchemaParams['resolverTypesPath'];
|
|
466
|
-
baseOutputDir: ParseGraphQLSchemaParams['baseOutputDir'];
|
|
467
|
-
blacklistedModules: ParseGraphQLSchemaParams['blacklistedModules'];
|
|
468
|
-
whitelistedModules: ParseGraphQLSchemaParams['whitelistedModules'];
|
|
469
|
-
schemaType: string;
|
|
470
|
-
nestedDirs: string[];
|
|
471
|
-
location: Location | undefined;
|
|
472
|
-
resolverName: string;
|
|
473
|
-
}): ResolverDetails | undefined => {
|
|
474
|
-
const parsedDetails = parseLocationForOutputDir({
|
|
475
|
-
nestedDirs,
|
|
476
|
-
location,
|
|
477
|
-
mode,
|
|
478
|
-
sourceMap,
|
|
479
|
-
resolverRelativeTargetDir,
|
|
480
|
-
baseOutputDir,
|
|
481
|
-
blacklistedModules,
|
|
482
|
-
whitelistedModules,
|
|
483
|
-
});
|
|
484
|
-
if (!parsedDetails) {
|
|
485
|
-
// No `parsedDetails` means the location is NOT whitelisted, ignore.
|
|
486
|
-
return;
|
|
487
|
-
}
|
|
488
|
-
const { moduleName, resolversOutputDir, relativePathFromBaseToModule } =
|
|
489
|
-
parsedDetails;
|
|
490
|
-
|
|
491
|
-
const normalizedResolverName = normalizeResolverName(
|
|
492
|
-
moduleName,
|
|
493
|
-
resolverName,
|
|
494
|
-
belongsToRootObject
|
|
495
|
-
);
|
|
496
|
-
|
|
497
|
-
const resolverFilePath = path.posix.join(
|
|
498
|
-
resolversOutputDir,
|
|
499
|
-
`${resolverName}.ts`
|
|
500
|
-
);
|
|
501
|
-
|
|
502
|
-
return {
|
|
503
|
-
schemaType,
|
|
504
|
-
moduleName,
|
|
505
|
-
resolverFile: {
|
|
506
|
-
name: resolverName,
|
|
507
|
-
path: resolverFilePath,
|
|
508
|
-
isOnFilesystem: fs.existsSync(resolverFilePath),
|
|
509
|
-
},
|
|
510
|
-
relativePathFromBaseToModule,
|
|
511
|
-
normalizedResolverName,
|
|
512
|
-
typeNamedImport: ({ generatedResolverTypes }) =>
|
|
513
|
-
generatedResolverTypes.userDefined[schemaType]?.name ||
|
|
514
|
-
`${schemaType}Resolvers`,
|
|
515
|
-
typeString: ({ generatedResolverTypes }) => {
|
|
516
|
-
if (belongsToRootObject) {
|
|
517
|
-
return generatedResolverTypes.userDefined[schemaType]
|
|
518
|
-
? `${generatedResolverTypes.userDefined[schemaType].name}['${resolverName}']`
|
|
519
|
-
: `${schemaType}Resolvers['${resolverName}']`;
|
|
520
|
-
}
|
|
521
|
-
return (
|
|
522
|
-
generatedResolverTypes.userDefined[schemaType]?.name ||
|
|
523
|
-
`${schemaType}Resolvers`
|
|
524
|
-
);
|
|
525
|
-
},
|
|
526
|
-
relativePathToResolverTypesFile: relativeModulePath(
|
|
527
|
-
resolversOutputDir,
|
|
528
|
-
resolverTypesPath
|
|
529
|
-
),
|
|
530
|
-
};
|
|
531
|
-
};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
|
-
import type { Location } from 'graphql';
|
|
3
|
-
import { parseLocationForWhitelistedModule } from '../utils/index.js';
|
|
4
|
-
import type { ParsedPresetConfig } from '../validatePresetConfig/index.js';
|
|
5
|
-
import type { ParseSourcesResult } from '../parseSources/index.js';
|
|
6
|
-
|
|
7
|
-
interface ParseLocationForOutputDirParams {
|
|
8
|
-
nestedDirs: string[];
|
|
9
|
-
location?: Location;
|
|
10
|
-
mode: ParsedPresetConfig['mode'];
|
|
11
|
-
sourceMap: ParseSourcesResult['sourceMap'];
|
|
12
|
-
whitelistedModules: string[];
|
|
13
|
-
blacklistedModules: string[];
|
|
14
|
-
baseOutputDir: string;
|
|
15
|
-
resolverRelativeTargetDir: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
type OutputDirResult =
|
|
19
|
-
| {
|
|
20
|
-
resolversOutputDir: string;
|
|
21
|
-
moduleName: string;
|
|
22
|
-
relativePathFromBaseToModule: string[];
|
|
23
|
-
}
|
|
24
|
-
| undefined;
|
|
25
|
-
/**
|
|
26
|
-
* Parse location to see which module it belongs to.
|
|
27
|
-
* Also check against whitelisted and blacklisted to see if need to generate file.
|
|
28
|
-
*/
|
|
29
|
-
export const parseLocationForOutputDir = ({
|
|
30
|
-
nestedDirs,
|
|
31
|
-
mode,
|
|
32
|
-
sourceMap,
|
|
33
|
-
whitelistedModules,
|
|
34
|
-
blacklistedModules,
|
|
35
|
-
baseOutputDir,
|
|
36
|
-
resolverRelativeTargetDir,
|
|
37
|
-
location,
|
|
38
|
-
}: ParseLocationForOutputDirParams): OutputDirResult => {
|
|
39
|
-
// If mode is "merged", there's only one module:
|
|
40
|
-
// - always generate a.k.a it's always whitelisted
|
|
41
|
-
// - put them together at designated relativeTargetDir
|
|
42
|
-
// - moduleName='' i.e. no module
|
|
43
|
-
if (mode === 'merged') {
|
|
44
|
-
return {
|
|
45
|
-
resolversOutputDir: path.posix.join(
|
|
46
|
-
baseOutputDir,
|
|
47
|
-
resolverRelativeTargetDir,
|
|
48
|
-
...nestedDirs
|
|
49
|
-
),
|
|
50
|
-
moduleName: '',
|
|
51
|
-
relativePathFromBaseToModule: [],
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// 2. mode is "modules", each module is the folder containing the schema files
|
|
56
|
-
// This means one or multiple schema files can add up to one module
|
|
57
|
-
const parsedSource = parseLocationForWhitelistedModule({
|
|
58
|
-
location,
|
|
59
|
-
sourceMap,
|
|
60
|
-
whitelistedModules,
|
|
61
|
-
blacklistedModules,
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
return parsedSource
|
|
65
|
-
? {
|
|
66
|
-
resolversOutputDir: path.posix.join(
|
|
67
|
-
baseOutputDir,
|
|
68
|
-
...parsedSource.relativePathFromBaseToModule,
|
|
69
|
-
resolverRelativeTargetDir,
|
|
70
|
-
...nestedDirs
|
|
71
|
-
),
|
|
72
|
-
moduleName: parsedSource.moduleName,
|
|
73
|
-
relativePathFromBaseToModule: parsedSource.relativePathFromBaseToModule,
|
|
74
|
-
}
|
|
75
|
-
: undefined;
|
|
76
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './parseSources.js';
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
|
-
import type { Source } from '@graphql-tools/utils';
|
|
3
|
-
import type { ModuleNamingMode } from '../validatePresetConfig/index.js';
|
|
4
|
-
|
|
5
|
-
export interface ParsedSource {
|
|
6
|
-
source: Source;
|
|
7
|
-
sourcePath: path.ParsedPath;
|
|
8
|
-
moduleName: string;
|
|
9
|
-
relativePathFromBaseToModule: string[];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface ParseSourcesResult {
|
|
13
|
-
sourceMap: Record<string, ParsedSource>;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function parseSources({
|
|
17
|
-
sources,
|
|
18
|
-
baseOutputDir,
|
|
19
|
-
moduleNamingMode,
|
|
20
|
-
}: {
|
|
21
|
-
sources: Source[];
|
|
22
|
-
baseOutputDir: string;
|
|
23
|
-
moduleNamingMode: ModuleNamingMode;
|
|
24
|
-
}): ParseSourcesResult {
|
|
25
|
-
return sources.reduce<ParseSourcesResult>(
|
|
26
|
-
(result, source) => {
|
|
27
|
-
if (!source.location) {
|
|
28
|
-
throw new Error('Missing source location');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const sourcePath = path.parse(source.location);
|
|
32
|
-
|
|
33
|
-
const relativePathFromBaseToModule = path
|
|
34
|
-
.relative(path.resolve(baseOutputDir), path.resolve(sourcePath.dir))
|
|
35
|
-
.split(path.sep);
|
|
36
|
-
|
|
37
|
-
const moduleName = selectModuleName({
|
|
38
|
-
moduleNamingMode,
|
|
39
|
-
relativePathFromBaseToModule,
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
result.sourceMap[source.location] = {
|
|
43
|
-
source,
|
|
44
|
-
sourcePath,
|
|
45
|
-
moduleName,
|
|
46
|
-
relativePathFromBaseToModule,
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
return result;
|
|
50
|
-
},
|
|
51
|
-
{ sourceMap: {} }
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const selectModuleName = ({
|
|
56
|
-
moduleNamingMode,
|
|
57
|
-
relativePathFromBaseToModule,
|
|
58
|
-
}: {
|
|
59
|
-
moduleNamingMode: ModuleNamingMode;
|
|
60
|
-
relativePathFromBaseToModule: string[];
|
|
61
|
-
}): string => {
|
|
62
|
-
if (moduleNamingMode === 'all') {
|
|
63
|
-
return relativePathFromBaseToModule.join('_');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const wrappedModuleNamingMode =
|
|
67
|
-
moduleNamingMode >= 0
|
|
68
|
-
? moduleNamingMode
|
|
69
|
-
: relativePathFromBaseToModule.length + moduleNamingMode;
|
|
70
|
-
|
|
71
|
-
if (
|
|
72
|
-
wrappedModuleNamingMode < 0 ||
|
|
73
|
-
wrappedModuleNamingMode >= relativePathFromBaseToModule.length
|
|
74
|
-
) {
|
|
75
|
-
throw new Error(
|
|
76
|
-
`"moduleNamingMode" ${moduleNamingMode} exceeds path ${relativePathFromBaseToModule.join(
|
|
77
|
-
'/'
|
|
78
|
-
)}`
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return relativePathFromBaseToModule[wrappedModuleNamingMode];
|
|
83
|
-
};
|