@eddeee888/gcg-typescript-resolver-files 0.18.0 → 0.18.1

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.
Files changed (78) hide show
  1. package/package.json +6 -2
  2. package/CHANGELOG.md +0 -816
  3. package/DEVELOPMENT.md +0 -49
  4. package/dist/tsconfig.lib.tsbuildinfo +0 -1
  5. package/eslint.config.mjs +0 -22
  6. package/project.json +0 -8
  7. package/src/addVirtualTypesFileToTsMorphProject/addVirtualTypesFileToTsMorphProject.ts +0 -109
  8. package/src/addVirtualTypesFileToTsMorphProject/index.ts +0 -1
  9. package/src/defineConfig.spec.ts +0 -76
  10. package/src/defineConfig.ts +0 -37
  11. package/src/generateResolverFiles/addExternalResolverImport.ts +0 -185
  12. package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.spec.ts +0 -1174
  13. package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.ts +0 -144
  14. package/src/generateResolverFiles/addResolverMainFiles.ts +0 -343
  15. package/src/generateResolverFiles/ensureEnumTypeResolversAreGenerated.ts +0 -51
  16. package/src/generateResolverFiles/generateResolverFiles.ts +0 -148
  17. package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.spec.ts +0 -127
  18. package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.ts +0 -25
  19. package/src/generateResolverFiles/getVariableStatementWithExpectedIdentifier.spec.ts +0 -147
  20. package/src/generateResolverFiles/getVariableStatementWithExpectedIdentifier.ts +0 -34
  21. package/src/generateResolverFiles/handleGraphQLEnumType.ts +0 -100
  22. package/src/generateResolverFiles/handleGraphQLInterfaceType.ts +0 -70
  23. package/src/generateResolverFiles/handleGraphQLObjectType.ts +0 -171
  24. package/src/generateResolverFiles/handleGraphQLRootObjectTypeField.ts +0 -105
  25. package/src/generateResolverFiles/handleGraphQLScalarType.ts +0 -81
  26. package/src/generateResolverFiles/handleGraphQLUnionType.ts +0 -68
  27. package/src/generateResolverFiles/index.ts +0 -2
  28. package/src/generateResolverFiles/postProcessFiles.ts +0 -287
  29. package/src/generateResolverFiles/types.ts +0 -203
  30. package/src/generateResolverFiles/visitNamedType.ts +0 -66
  31. package/src/generateTypeDefsFiles/generateTypeDefsContent.ts +0 -15
  32. package/src/generateTypeDefsFiles/generateTypeDefsFiles.ts +0 -100
  33. package/src/generateTypeDefsFiles/index.ts +0 -1
  34. package/src/getGraphQLObjectTypeResolversToGenerate/getGraphQLObjectTypeResolversToGenerate.ts +0 -361
  35. package/src/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.spec.ts +0 -115
  36. package/src/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.ts +0 -88
  37. package/src/getGraphQLObjectTypeResolversToGenerate/index.ts +0 -1
  38. package/src/index.ts +0 -3
  39. package/src/normalizeAddConfigPath/index.ts +0 -1
  40. package/src/normalizeAddConfigPath/normalizeAddConfigPath.ts +0 -29
  41. package/src/parseGraphQLSchema/index.ts +0 -2
  42. package/src/parseGraphQLSchema/normalizeResolverName.ts +0 -28
  43. package/src/parseGraphQLSchema/parseGraphQLSchema.ts +0 -531
  44. package/src/parseGraphQLSchema/parseLocationForOutputDir.ts +0 -76
  45. package/src/parseSources/index.ts +0 -1
  46. package/src/parseSources/parseSources.ts +0 -83
  47. package/src/parseTypeMappers/collectTypeMappersFromSourceFile.spec.ts +0 -789
  48. package/src/parseTypeMappers/collectTypeMappersFromSourceFile.ts +0 -197
  49. package/src/parseTypeMappers/index.ts +0 -1
  50. package/src/parseTypeMappers/parseTypeMappers.ts +0 -75
  51. package/src/preset.ts +0 -317
  52. package/src/utils/cwd.ts +0 -8
  53. package/src/utils/fmt.ts +0 -16
  54. package/src/utils/index.ts +0 -12
  55. package/src/utils/isMatchResolverNamePattern.ts +0 -27
  56. package/src/utils/isNativeNamedType.ts +0 -21
  57. package/src/utils/isRootObjectType.ts +0 -8
  58. package/src/utils/isWhitelistedModule.spec.ts +0 -71
  59. package/src/utils/isWhitelistedModule.ts +0 -21
  60. package/src/utils/logger.ts +0 -14
  61. package/src/utils/normalizeImportExtension.spec.ts +0 -42
  62. package/src/utils/normalizeImportExtension.ts +0 -16
  63. package/src/utils/normalizeRelativePath.ts +0 -6
  64. package/src/utils/parseLocationForWhitelistedModule.spec.ts +0 -130
  65. package/src/utils/parseLocationForWhitelistedModule.ts +0 -38
  66. package/src/utils/printImportLine.spec.ts +0 -150
  67. package/src/utils/printImportLine.ts +0 -78
  68. package/src/utils/relativeModulePath.ts +0 -7
  69. package/src/validateAndMergeParsedConfigs/index.ts +0 -1
  70. package/src/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.spec.ts +0 -211
  71. package/src/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.ts +0 -92
  72. package/src/validatePresetConfig/index.ts +0 -1
  73. package/src/validatePresetConfig/validatePresetConfig.spec.ts +0 -706
  74. package/src/validatePresetConfig/validatePresetConfig.ts +0 -571
  75. package/tsconfig.json +0 -14
  76. package/tsconfig.lib.json +0 -18
  77. package/tsconfig.spec.json +0 -20
  78. 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
- };