@eddeee888/gcg-typescript-resolver-files 0.16.0 → 0.18.0
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/CHANGELOG.md +816 -0
- package/DEVELOPMENT.md +49 -0
- package/LICENSE +21 -0
- package/README.md +3 -3
- package/{src → dist}/addVirtualTypesFileToTsMorphProject/addVirtualTypesFileToTsMorphProject.d.ts +2 -2
- package/{src → dist}/addVirtualTypesFileToTsMorphProject/addVirtualTypesFileToTsMorphProject.js +11 -17
- package/dist/addVirtualTypesFileToTsMorphProject/index.d.ts +1 -0
- package/dist/addVirtualTypesFileToTsMorphProject/index.js +1 -0
- package/{src → dist}/defineConfig.d.ts +1 -1
- package/{src → dist}/defineConfig.js +4 -10
- package/{src → dist}/generateResolverFiles/addExternalResolverImport.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/addExternalResolverImport.js +3 -8
- package/{src → dist}/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.js +9 -14
- package/{src → dist}/generateResolverFiles/addResolverMainFiles.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/addResolverMainFiles.js +11 -17
- package/{src → dist}/generateResolverFiles/ensureEnumTypeResolversAreGenerated.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/ensureEnumTypeResolversAreGenerated.js +6 -11
- package/{src → dist}/generateResolverFiles/generateResolverFiles.d.ts +1 -1
- package/dist/generateResolverFiles/generateResolverFiles.js +87 -0
- package/{src → dist}/generateResolverFiles/getImportStatementWithExpectedNamedImport.d.ts +1 -1
- package/dist/generateResolverFiles/getImportStatementWithExpectedNamedImport.js +14 -0
- package/{src → dist}/generateResolverFiles/getVariableStatementWithExpectedIdentifier.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/getVariableStatementWithExpectedIdentifier.js +1 -6
- package/{src → dist}/generateResolverFiles/handleGraphQLEnumType.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/handleGraphQLEnumType.js +6 -11
- package/{src → dist}/generateResolverFiles/handleGraphQLInterfaceType.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/handleGraphQLInterfaceType.js +6 -11
- package/{src → dist}/generateResolverFiles/handleGraphQLObjectType.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/handleGraphQLObjectType.js +8 -14
- package/dist/generateResolverFiles/handleGraphQLRootObjectTypeField.d.ts +3 -0
- package/{src → dist}/generateResolverFiles/handleGraphQLRootObjectTypeField.js +8 -13
- package/{src → dist}/generateResolverFiles/handleGraphQLScalarType.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/handleGraphQLScalarType.js +6 -11
- package/{src → dist}/generateResolverFiles/handleGraphQLUnionType.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/handleGraphQLUnionType.js +5 -10
- package/dist/generateResolverFiles/index.d.ts +2 -0
- package/dist/generateResolverFiles/index.js +1 -0
- package/{src → dist}/generateResolverFiles/postProcessFiles.d.ts +1 -1
- package/{src → dist}/generateResolverFiles/postProcessFiles.js +24 -26
- package/{src → dist}/generateResolverFiles/types.d.ts +6 -6
- package/dist/generateResolverFiles/types.js +1 -0
- package/{src → dist}/generateResolverFiles/visitNamedType.d.ts +2 -2
- package/{src → dist}/generateResolverFiles/visitNamedType.js +3 -8
- package/dist/generateTypeDefsFiles/generateTypeDefsContent.js +7 -0
- package/{src → dist}/generateTypeDefsFiles/generateTypeDefsFiles.d.ts +3 -3
- package/{src → dist}/generateTypeDefsFiles/generateTypeDefsFiles.js +7 -13
- package/dist/generateTypeDefsFiles/index.d.ts +1 -0
- package/dist/generateTypeDefsFiles/index.js +1 -0
- package/{src → dist}/getGraphQLObjectTypeResolversToGenerate/getGraphQLObjectTypeResolversToGenerate.d.ts +3 -3
- package/{src → dist}/getGraphQLObjectTypeResolversToGenerate/getGraphQLObjectTypeResolversToGenerate.js +17 -22
- package/{src → dist}/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.js +5 -10
- package/dist/getGraphQLObjectTypeResolversToGenerate/index.d.ts +1 -0
- package/dist/getGraphQLObjectTypeResolversToGenerate/index.js +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/normalizeAddConfigPath/index.d.ts +1 -0
- package/dist/normalizeAddConfigPath/index.js +1 -0
- package/{src → dist}/normalizeAddConfigPath/normalizeAddConfigPath.d.ts +1 -1
- package/{src → dist}/normalizeAddConfigPath/normalizeAddConfigPath.js +2 -8
- package/{src → dist}/parseGraphQLSchema/index.d.ts +2 -2
- package/dist/parseGraphQLSchema/index.js +1 -0
- package/{src → dist}/parseGraphQLSchema/normalizeResolverName.d.ts +1 -1
- package/{src → dist}/parseGraphQLSchema/normalizeResolverName.js +1 -6
- package/{src → dist}/parseGraphQLSchema/parseGraphQLSchema.d.ts +5 -5
- package/{src → dist}/parseGraphQLSchema/parseGraphQLSchema.js +43 -50
- package/{src → dist}/parseGraphQLSchema/parseLocationForOutputDir.d.ts +2 -2
- package/{src → dist}/parseGraphQLSchema/parseLocationForOutputDir.js +4 -10
- package/dist/parseSources/index.d.ts +1 -0
- package/dist/parseSources/index.js +1 -0
- package/{src → dist}/parseSources/parseSources.d.ts +1 -1
- package/{src → dist}/parseSources/parseSources.js +2 -7
- package/{src → dist}/parseTypeMappers/collectTypeMappersFromSourceFile.d.ts +2 -2
- package/{src → dist}/parseTypeMappers/collectTypeMappersFromSourceFile.js +15 -21
- package/dist/parseTypeMappers/index.d.ts +1 -0
- package/dist/parseTypeMappers/index.js +1 -0
- package/{src → dist}/parseTypeMappers/parseTypeMappers.d.ts +2 -2
- package/dist/parseTypeMappers/parseTypeMappers.js +20 -0
- package/{src → dist}/preset.d.ts +1 -1
- package/dist/preset.js +214 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/utils/cwd.js +7 -0
- package/dist/utils/fmt.js +15 -0
- package/dist/utils/index.d.ts +12 -0
- package/dist/utils/index.js +12 -0
- package/{src → dist}/utils/isMatchResolverNamePattern.js +3 -9
- package/dist/utils/isNativeNamedType.js +13 -0
- package/dist/utils/isRootObjectType.js +3 -0
- package/{src → dist}/utils/isWhitelistedModule.js +1 -6
- package/{src → dist}/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +13 -0
- package/dist/utils/normalizeImportExtension.js +9 -0
- package/dist/utils/normalizeRelativePath.js +6 -0
- package/{src → dist}/utils/parseLocationForWhitelistedModule.d.ts +1 -1
- package/dist/utils/parseLocationForWhitelistedModule.js +17 -0
- package/{src → dist}/utils/printImportLine.d.ts +1 -1
- package/{src → dist}/utils/printImportLine.js +3 -7
- package/dist/utils/relativeModulePath.js +6 -0
- package/dist/validateAndMergeParsedConfigs/index.d.ts +1 -0
- package/dist/validateAndMergeParsedConfigs/index.js +1 -0
- package/{src → dist}/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.d.ts +2 -2
- package/{src → dist}/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.js +16 -13
- package/dist/validatePresetConfig/index.d.ts +1 -0
- package/dist/validatePresetConfig/index.js +1 -0
- package/{src → dist}/validatePresetConfig/validatePresetConfig.d.ts +2 -2
- package/{src → dist}/validatePresetConfig/validatePresetConfig.js +29 -36
- package/eslint.config.mjs +22 -0
- package/package.json +25 -18
- package/project.json +8 -0
- package/src/addVirtualTypesFileToTsMorphProject/addVirtualTypesFileToTsMorphProject.ts +109 -0
- package/src/addVirtualTypesFileToTsMorphProject/index.ts +1 -0
- package/src/defineConfig.spec.ts +76 -0
- package/src/defineConfig.ts +37 -0
- package/src/generateResolverFiles/addExternalResolverImport.ts +185 -0
- package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.spec.ts +1174 -0
- package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.ts +144 -0
- package/src/generateResolverFiles/addResolverMainFiles.ts +343 -0
- package/src/generateResolverFiles/ensureEnumTypeResolversAreGenerated.ts +51 -0
- package/src/generateResolverFiles/generateResolverFiles.ts +148 -0
- package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.spec.ts +127 -0
- package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.ts +25 -0
- package/src/generateResolverFiles/getVariableStatementWithExpectedIdentifier.spec.ts +147 -0
- package/src/generateResolverFiles/getVariableStatementWithExpectedIdentifier.ts +34 -0
- package/src/generateResolverFiles/handleGraphQLEnumType.ts +100 -0
- package/src/generateResolverFiles/handleGraphQLInterfaceType.ts +70 -0
- package/src/generateResolverFiles/handleGraphQLObjectType.ts +171 -0
- package/src/generateResolverFiles/handleGraphQLRootObjectTypeField.ts +105 -0
- package/src/generateResolverFiles/handleGraphQLScalarType.ts +81 -0
- package/src/generateResolverFiles/handleGraphQLUnionType.ts +68 -0
- package/src/generateResolverFiles/index.ts +2 -0
- package/src/generateResolverFiles/postProcessFiles.ts +287 -0
- package/src/generateResolverFiles/types.ts +203 -0
- package/src/generateResolverFiles/visitNamedType.ts +66 -0
- package/src/generateTypeDefsFiles/generateTypeDefsContent.ts +15 -0
- package/src/generateTypeDefsFiles/generateTypeDefsFiles.ts +100 -0
- package/src/generateTypeDefsFiles/index.ts +1 -0
- package/src/getGraphQLObjectTypeResolversToGenerate/getGraphQLObjectTypeResolversToGenerate.ts +361 -0
- package/src/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.spec.ts +115 -0
- package/src/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.ts +88 -0
- package/src/getGraphQLObjectTypeResolversToGenerate/index.ts +1 -0
- package/src/index.ts +3 -0
- package/src/normalizeAddConfigPath/index.ts +1 -0
- package/src/normalizeAddConfigPath/normalizeAddConfigPath.ts +29 -0
- package/src/parseGraphQLSchema/index.ts +2 -0
- package/src/parseGraphQLSchema/normalizeResolverName.ts +28 -0
- package/src/parseGraphQLSchema/parseGraphQLSchema.ts +531 -0
- package/src/parseGraphQLSchema/parseLocationForOutputDir.ts +76 -0
- package/src/parseSources/index.ts +1 -0
- package/src/parseSources/parseSources.ts +83 -0
- package/src/parseTypeMappers/collectTypeMappersFromSourceFile.spec.ts +789 -0
- package/src/parseTypeMappers/collectTypeMappersFromSourceFile.ts +197 -0
- package/src/parseTypeMappers/index.ts +1 -0
- package/src/parseTypeMappers/parseTypeMappers.ts +75 -0
- package/src/preset.ts +317 -0
- package/src/utils/cwd.ts +8 -0
- package/src/utils/fmt.ts +16 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/isMatchResolverNamePattern.ts +27 -0
- package/src/utils/isNativeNamedType.ts +21 -0
- package/src/utils/isRootObjectType.ts +8 -0
- package/src/utils/isWhitelistedModule.spec.ts +71 -0
- package/src/utils/isWhitelistedModule.ts +21 -0
- package/src/utils/logger.ts +14 -0
- package/src/utils/normalizeImportExtension.spec.ts +42 -0
- package/src/utils/normalizeImportExtension.ts +16 -0
- package/src/utils/normalizeRelativePath.ts +6 -0
- package/src/utils/parseLocationForWhitelistedModule.spec.ts +130 -0
- package/src/utils/parseLocationForWhitelistedModule.ts +38 -0
- package/src/utils/printImportLine.spec.ts +150 -0
- package/src/utils/printImportLine.ts +78 -0
- package/src/utils/relativeModulePath.ts +7 -0
- package/src/validateAndMergeParsedConfigs/index.ts +1 -0
- package/src/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.spec.ts +211 -0
- package/src/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.ts +92 -0
- package/src/validatePresetConfig/index.ts +1 -0
- package/src/validatePresetConfig/validatePresetConfig.spec.ts +706 -0
- package/src/validatePresetConfig/validatePresetConfig.ts +571 -0
- package/tsconfig.json +14 -0
- package/tsconfig.lib.json +18 -0
- package/tsconfig.spec.json +20 -0
- package/vite.config.ts +24 -0
- package/src/addVirtualTypesFileToTsMorphProject/addVirtualTypesFileToTsMorphProject.js.map +0 -1
- package/src/addVirtualTypesFileToTsMorphProject/index.d.ts +0 -1
- package/src/addVirtualTypesFileToTsMorphProject/index.js +0 -5
- package/src/addVirtualTypesFileToTsMorphProject/index.js.map +0 -1
- package/src/defineConfig.js.map +0 -1
- package/src/generateResolverFiles/addExternalResolverImport.js.map +0 -1
- package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.js.map +0 -1
- package/src/generateResolverFiles/addResolverMainFiles.js.map +0 -1
- package/src/generateResolverFiles/ensureEnumTypeResolversAreGenerated.js.map +0 -1
- package/src/generateResolverFiles/generateResolverFiles.js +0 -54
- package/src/generateResolverFiles/generateResolverFiles.js.map +0 -1
- package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.js +0 -20
- package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.js.map +0 -1
- package/src/generateResolverFiles/getVariableStatementWithExpectedIdentifier.js.map +0 -1
- package/src/generateResolverFiles/handleGraphQLEnumType.js.map +0 -1
- package/src/generateResolverFiles/handleGraphQLInterfaceType.js.map +0 -1
- package/src/generateResolverFiles/handleGraphQLObjectType.js.map +0 -1
- package/src/generateResolverFiles/handleGraphQLRootObjectTypeField.d.ts +0 -3
- package/src/generateResolverFiles/handleGraphQLRootObjectTypeField.js.map +0 -1
- package/src/generateResolverFiles/handleGraphQLScalarType.js.map +0 -1
- package/src/generateResolverFiles/handleGraphQLUnionType.js.map +0 -1
- package/src/generateResolverFiles/index.d.ts +0 -2
- package/src/generateResolverFiles/index.js +0 -6
- package/src/generateResolverFiles/index.js.map +0 -1
- package/src/generateResolverFiles/postProcessFiles.js.map +0 -1
- package/src/generateResolverFiles/types.js +0 -3
- package/src/generateResolverFiles/types.js.map +0 -1
- package/src/generateResolverFiles/visitNamedType.js.map +0 -1
- package/src/generateTypeDefsFiles/generateTypeDefsContent.js +0 -12
- package/src/generateTypeDefsFiles/generateTypeDefsContent.js.map +0 -1
- package/src/generateTypeDefsFiles/generateTypeDefsFiles.js.map +0 -1
- package/src/generateTypeDefsFiles/index.d.ts +0 -1
- package/src/generateTypeDefsFiles/index.js +0 -5
- package/src/generateTypeDefsFiles/index.js.map +0 -1
- package/src/getGraphQLObjectTypeResolversToGenerate/getGraphQLObjectTypeResolversToGenerate.js.map +0 -1
- package/src/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.js.map +0 -1
- package/src/getGraphQLObjectTypeResolversToGenerate/index.d.ts +0 -1
- package/src/getGraphQLObjectTypeResolversToGenerate/index.js +0 -5
- package/src/getGraphQLObjectTypeResolversToGenerate/index.js.map +0 -1
- package/src/index.d.ts +0 -3
- package/src/index.js +0 -10
- package/src/index.js.map +0 -1
- package/src/normalizeAddConfigPath/index.d.ts +0 -1
- package/src/normalizeAddConfigPath/index.js +0 -5
- package/src/normalizeAddConfigPath/index.js.map +0 -1
- package/src/normalizeAddConfigPath/normalizeAddConfigPath.js.map +0 -1
- package/src/parseGraphQLSchema/index.js +0 -5
- package/src/parseGraphQLSchema/index.js.map +0 -1
- package/src/parseGraphQLSchema/normalizeResolverName.js.map +0 -1
- package/src/parseGraphQLSchema/parseGraphQLSchema.js.map +0 -1
- package/src/parseGraphQLSchema/parseLocationForOutputDir.js.map +0 -1
- package/src/parseSources/index.d.ts +0 -1
- package/src/parseSources/index.js +0 -5
- package/src/parseSources/index.js.map +0 -1
- package/src/parseSources/parseSources.js.map +0 -1
- package/src/parseTypeMappers/collectTypeMappersFromSourceFile.js.map +0 -1
- package/src/parseTypeMappers/index.d.ts +0 -1
- package/src/parseTypeMappers/index.js +0 -5
- package/src/parseTypeMappers/index.js.map +0 -1
- package/src/parseTypeMappers/parseTypeMappers.js +0 -26
- package/src/parseTypeMappers/parseTypeMappers.js.map +0 -1
- package/src/preset.js +0 -214
- package/src/preset.js.map +0 -1
- package/src/utils/cwd.js +0 -13
- package/src/utils/cwd.js.map +0 -1
- package/src/utils/fmt.js +0 -19
- package/src/utils/fmt.js.map +0 -1
- package/src/utils/index.d.ts +0 -12
- package/src/utils/index.js +0 -16
- package/src/utils/index.js.map +0 -1
- package/src/utils/isMatchResolverNamePattern.js.map +0 -1
- package/src/utils/isNativeNamedType.js +0 -18
- package/src/utils/isNativeNamedType.js.map +0 -1
- package/src/utils/isRootObjectType.js +0 -8
- package/src/utils/isRootObjectType.js.map +0 -1
- package/src/utils/isWhitelistedModule.js.map +0 -1
- package/src/utils/logger.js +0 -17
- package/src/utils/logger.js.map +0 -1
- package/src/utils/normalizeImportExtension.js +0 -13
- package/src/utils/normalizeImportExtension.js.map +0 -1
- package/src/utils/normalizeRelativePath.js +0 -11
- package/src/utils/normalizeRelativePath.js.map +0 -1
- package/src/utils/parseLocationForWhitelistedModule.js +0 -22
- package/src/utils/parseLocationForWhitelistedModule.js.map +0 -1
- package/src/utils/printImportLine.js.map +0 -1
- package/src/utils/relativeModulePath.js +0 -12
- package/src/utils/relativeModulePath.js.map +0 -1
- package/src/validateAndMergeParsedConfigs/index.d.ts +0 -1
- package/src/validateAndMergeParsedConfigs/index.js +0 -5
- package/src/validateAndMergeParsedConfigs/index.js.map +0 -1
- package/src/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.js.map +0 -1
- package/src/validatePresetConfig/index.d.ts +0 -1
- package/src/validatePresetConfig/index.js +0 -5
- package/src/validatePresetConfig/index.js.map +0 -1
- package/src/validatePresetConfig/validatePresetConfig.js.map +0 -1
- /package/{src → dist}/generateTypeDefsFiles/generateTypeDefsContent.d.ts +0 -0
- /package/{src → dist}/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.d.ts +0 -0
- /package/{src → dist}/utils/cwd.d.ts +0 -0
- /package/{src → dist}/utils/fmt.d.ts +0 -0
- /package/{src → dist}/utils/isMatchResolverNamePattern.d.ts +0 -0
- /package/{src → dist}/utils/isNativeNamedType.d.ts +0 -0
- /package/{src → dist}/utils/isRootObjectType.d.ts +0 -0
- /package/{src → dist}/utils/isWhitelistedModule.d.ts +0 -0
- /package/{src → dist}/utils/normalizeImportExtension.d.ts +0 -0
- /package/{src → dist}/utils/normalizeRelativePath.d.ts +0 -0
- /package/{src → dist}/utils/relativeModulePath.d.ts +0 -0
package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.ts
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { type PropertyAssignment, type SourceFile, SyntaxKind } from 'ts-morph';
|
|
2
|
+
import type { ObjectTypeFile } from './types.js';
|
|
3
|
+
import { getVariableStatementWithExpectedIdentifier } from './getVariableStatementWithExpectedIdentifier.js';
|
|
4
|
+
|
|
5
|
+
export type AddedPropertyAssignmentNodes = Record<
|
|
6
|
+
string, // SourceFile's filename
|
|
7
|
+
Record<
|
|
8
|
+
number, // Line number
|
|
9
|
+
{
|
|
10
|
+
node: PropertyAssignment;
|
|
11
|
+
resolverFile: ObjectTypeFile;
|
|
12
|
+
__toBeRemoved: boolean;
|
|
13
|
+
}
|
|
14
|
+
>
|
|
15
|
+
>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Ensure objectTypeResolver files have all the resolvers due to mismatched types
|
|
19
|
+
*/
|
|
20
|
+
export const addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented = ({
|
|
21
|
+
addedPropertyAssignmentNodes,
|
|
22
|
+
sourceFile,
|
|
23
|
+
resolverFile,
|
|
24
|
+
mode,
|
|
25
|
+
}: {
|
|
26
|
+
addedPropertyAssignmentNodes: AddedPropertyAssignmentNodes;
|
|
27
|
+
sourceFile: SourceFile;
|
|
28
|
+
resolverFile: ObjectTypeFile;
|
|
29
|
+
mode: 'smart' | 'fast';
|
|
30
|
+
}): void => {
|
|
31
|
+
const sourceFilePath = sourceFile.getFilePath().toString();
|
|
32
|
+
addedPropertyAssignmentNodes[sourceFilePath] =
|
|
33
|
+
addedPropertyAssignmentNodes[sourceFilePath] || {};
|
|
34
|
+
|
|
35
|
+
const resolversToGenerate = resolverFile.meta.resolversToGenerate || {};
|
|
36
|
+
if (!Object.keys(resolversToGenerate).length) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const { variableStatement } = getVariableStatementWithExpectedIdentifier(
|
|
41
|
+
sourceFile,
|
|
42
|
+
resolverFile
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
if (!variableStatement) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
'Missing variableStatement in addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.'
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 1. Check to see which generated to-be-generated resolvers are implemented
|
|
52
|
+
const resolversData: Record<
|
|
53
|
+
string,
|
|
54
|
+
{
|
|
55
|
+
resolverName: string;
|
|
56
|
+
resolverDeclaration: string;
|
|
57
|
+
implemented?: true;
|
|
58
|
+
}
|
|
59
|
+
> = { ...resolversToGenerate };
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* PropertyAssignment
|
|
63
|
+
* ```
|
|
64
|
+
* const name = () => {};
|
|
65
|
+
* const OutputType = {
|
|
66
|
+
* id: () => {},
|
|
67
|
+
* name: name,
|
|
68
|
+
* }
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
variableStatement
|
|
72
|
+
.getDescendantsOfKind(SyntaxKind.PropertyAssignment)
|
|
73
|
+
.forEach((propertyAssignment) => {
|
|
74
|
+
const resolverName = propertyAssignment.getName();
|
|
75
|
+
if (resolversData[resolverName]) {
|
|
76
|
+
resolversData[resolverName].implemented = true;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* MethodDeclaration
|
|
82
|
+
* ```
|
|
83
|
+
* const OutputType = {
|
|
84
|
+
* id(){},
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
variableStatement
|
|
89
|
+
.getDescendantsOfKind(SyntaxKind.MethodDeclaration)
|
|
90
|
+
.forEach((methodDeclaration) => {
|
|
91
|
+
const resolverName = methodDeclaration.getName();
|
|
92
|
+
if (resolversData[resolverName]) {
|
|
93
|
+
resolversData[resolverName].implemented = true;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* ShorthandPropertyAssignment example:
|
|
99
|
+
* ```
|
|
100
|
+
* const id = () => {};
|
|
101
|
+
* const OutputType = {
|
|
102
|
+
* id,
|
|
103
|
+
* }
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
variableStatement
|
|
107
|
+
.getDescendantsOfKind(SyntaxKind.ShorthandPropertyAssignment)
|
|
108
|
+
.forEach((propertyAssignment) => {
|
|
109
|
+
const resolverName = propertyAssignment.getName();
|
|
110
|
+
if (resolversData[resolverName]) {
|
|
111
|
+
resolversData[resolverName].implemented = true;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// 2. Add missing resolver properties if they haven't been implemented
|
|
116
|
+
Object.values(resolversData).forEach(
|
|
117
|
+
({ resolverName, resolverDeclaration, implemented }) => {
|
|
118
|
+
if (implemented) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const addedNode = variableStatement
|
|
123
|
+
.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression)[0]
|
|
124
|
+
.addPropertyAssignment({
|
|
125
|
+
name: resolverName,
|
|
126
|
+
initializer: resolverDeclaration,
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
if (mode === 'fast') {
|
|
130
|
+
resolverFile.filesystem.contentUpdated = true;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
addedPropertyAssignmentNodes[sourceFilePath][
|
|
134
|
+
addedNode.getStartLineNumber()
|
|
135
|
+
] = {
|
|
136
|
+
node: addedNode,
|
|
137
|
+
resolverFile,
|
|
138
|
+
// When mode is "smart", we use TS compiler for typechecking, and it'd remove the node if there is no compilation error. Therefore, `__toBeRemoved: true`
|
|
139
|
+
// When mode is "fast", we already check whether the the type is assignable, so no need to remove the node.
|
|
140
|
+
__toBeRemoved: mode === 'fast' ? false : true,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
};
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import {
|
|
3
|
+
isRootObjectType,
|
|
4
|
+
printImportLine,
|
|
5
|
+
relativeModulePath,
|
|
6
|
+
type RootObjectType,
|
|
7
|
+
} from '../utils/index.js';
|
|
8
|
+
import type { GenerateResolverFilesContext } from './types.js';
|
|
9
|
+
|
|
10
|
+
interface FileDetails {
|
|
11
|
+
importLines: string[];
|
|
12
|
+
queryFields: ObjectFieldMapping[];
|
|
13
|
+
mutationFields: ObjectFieldMapping[];
|
|
14
|
+
subscriptionFields: ObjectFieldMapping[];
|
|
15
|
+
objectTypes: ObjectTypesMap;
|
|
16
|
+
}
|
|
17
|
+
const createDefaultFileDetails = (): FileDetails => ({
|
|
18
|
+
importLines: [],
|
|
19
|
+
queryFields: [],
|
|
20
|
+
mutationFields: [],
|
|
21
|
+
subscriptionFields: [],
|
|
22
|
+
objectTypes: {},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* addResolverMainFiles
|
|
27
|
+
*
|
|
28
|
+
* @description Function to create resolver main file/s (default: resolvers.generated.ts)
|
|
29
|
+
* If resolverMainFileMode=merged, only one file is generated
|
|
30
|
+
* If resolverMainFileMode=modules, one file is generated for each module
|
|
31
|
+
* If no resolvers are created or imported, do not generate a file.
|
|
32
|
+
*/
|
|
33
|
+
export const addResolverMainFiles = ({
|
|
34
|
+
config: {
|
|
35
|
+
baseOutputDir,
|
|
36
|
+
resolverTypesPath,
|
|
37
|
+
resolverMainFile,
|
|
38
|
+
resolverMainFileMode,
|
|
39
|
+
emitLegacyCommonJSImports,
|
|
40
|
+
importExtension,
|
|
41
|
+
generatedTypesFileMeta: { generatedResolverTypes },
|
|
42
|
+
},
|
|
43
|
+
result,
|
|
44
|
+
}: GenerateResolverFilesContext): void => {
|
|
45
|
+
const baseIdentifierUsage = countBaseIdentifiersUsage(result.files);
|
|
46
|
+
|
|
47
|
+
const resolverMainFiles = Object.entries(result.files).reduce<
|
|
48
|
+
Record<string, FileDetails>
|
|
49
|
+
>((res, [filepath, file]) => {
|
|
50
|
+
if (file.__filetype === 'file') {
|
|
51
|
+
return res;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const { meta } = file;
|
|
55
|
+
|
|
56
|
+
// If resolverMainFileMode === 'modules', generate main resolver files into modules, otherwise, do it at baseOutputDir
|
|
57
|
+
const resolverMainFilename =
|
|
58
|
+
resolverMainFileMode === 'modules'
|
|
59
|
+
? path.posix.join(
|
|
60
|
+
baseOutputDir,
|
|
61
|
+
...meta.relativePathFromBaseToModule,
|
|
62
|
+
resolverMainFile
|
|
63
|
+
)
|
|
64
|
+
: path.posix.join(baseOutputDir, resolverMainFile);
|
|
65
|
+
|
|
66
|
+
const outputDir = path.dirname(resolverMainFilename);
|
|
67
|
+
|
|
68
|
+
if (!res[resolverMainFilename]) {
|
|
69
|
+
res[resolverMainFilename] = createDefaultFileDetails();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const baseIdentifierName = makeNormalizedResolverNameVariableCompatible(
|
|
73
|
+
file.meta.normalizedResolverName.base
|
|
74
|
+
);
|
|
75
|
+
const identifierName =
|
|
76
|
+
baseIdentifierUsage[baseIdentifierName] > 1
|
|
77
|
+
? makeNormalizedResolverNameVariableCompatible(
|
|
78
|
+
file.meta.normalizedResolverName.withModule
|
|
79
|
+
)
|
|
80
|
+
: baseIdentifierName;
|
|
81
|
+
|
|
82
|
+
const fieldMapping: ObjectFieldMapping = {
|
|
83
|
+
propertyName: file.mainImportIdentifier,
|
|
84
|
+
identifierName,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// Non Root Object fields that was generated
|
|
88
|
+
if (
|
|
89
|
+
file.__filetype === 'objectType' ||
|
|
90
|
+
file.__filetype === 'interfaceResolver' ||
|
|
91
|
+
file.__filetype === 'unionResolver' ||
|
|
92
|
+
file.__filetype === 'scalarResolver' ||
|
|
93
|
+
file.__filetype === 'enumResolver'
|
|
94
|
+
) {
|
|
95
|
+
res[resolverMainFilename].importLines.push(
|
|
96
|
+
printImportLine({
|
|
97
|
+
isTypeImport: false,
|
|
98
|
+
module: relativeModulePath(outputDir, filepath),
|
|
99
|
+
moduleType: 'file',
|
|
100
|
+
namedImports: [fieldMapping],
|
|
101
|
+
emitLegacyCommonJSImports,
|
|
102
|
+
importExtension,
|
|
103
|
+
})
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
pushToObjectTypes({
|
|
107
|
+
objectTypes: res[resolverMainFilename].objectTypes,
|
|
108
|
+
property: file.mainImportIdentifier,
|
|
109
|
+
value: identifierName,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
return res;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Root object fields
|
|
116
|
+
res[resolverMainFilename].importLines.push(
|
|
117
|
+
printImportLine({
|
|
118
|
+
isTypeImport: false,
|
|
119
|
+
module: relativeModulePath(outputDir, filepath),
|
|
120
|
+
moduleType: 'file',
|
|
121
|
+
namedImports: [fieldMapping],
|
|
122
|
+
emitLegacyCommonJSImports,
|
|
123
|
+
importExtension,
|
|
124
|
+
})
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
const rootObjectMap: Record<RootObjectType, () => void> = {
|
|
128
|
+
Query: () => res[resolverMainFilename].queryFields.push(fieldMapping),
|
|
129
|
+
Mutation: () =>
|
|
130
|
+
res[resolverMainFilename].mutationFields.push(fieldMapping),
|
|
131
|
+
Subscription: () =>
|
|
132
|
+
res[resolverMainFilename].subscriptionFields.push(fieldMapping),
|
|
133
|
+
};
|
|
134
|
+
rootObjectMap[file.meta.belongsToRootObject]();
|
|
135
|
+
|
|
136
|
+
return res;
|
|
137
|
+
}, {});
|
|
138
|
+
|
|
139
|
+
Object.entries(result.externalImports).reduce((res, [module, meta]) => {
|
|
140
|
+
// If resolverMainFileMode === 'modules', generate main resolver files into modules, otherwise, do it at baseOutputDir
|
|
141
|
+
const resolverMainFilename =
|
|
142
|
+
resolverMainFileMode === 'modules'
|
|
143
|
+
? path.posix.join(
|
|
144
|
+
baseOutputDir,
|
|
145
|
+
...meta.relativePathFromBaseToModule,
|
|
146
|
+
resolverMainFile
|
|
147
|
+
)
|
|
148
|
+
: path.posix.join(baseOutputDir, resolverMainFile);
|
|
149
|
+
|
|
150
|
+
if (!res[resolverMainFilename]) {
|
|
151
|
+
res[resolverMainFilename] = createDefaultFileDetails();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
res[resolverMainFilename].importLines.push(
|
|
155
|
+
printImportLine({
|
|
156
|
+
isTypeImport: false,
|
|
157
|
+
module,
|
|
158
|
+
moduleType: 'preserve',
|
|
159
|
+
namedImports: meta.importLineMeta.namedImports,
|
|
160
|
+
defaultImport: meta.importLineMeta.defaultImport,
|
|
161
|
+
emitLegacyCommonJSImports,
|
|
162
|
+
importExtension,
|
|
163
|
+
})
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
meta.identifierUsages.forEach((usage) => {
|
|
167
|
+
const resolverNameParts = usage.normalizedResolverName.split('.');
|
|
168
|
+
|
|
169
|
+
// Only 1 part, this is a GraphQL ObjectType
|
|
170
|
+
if (resolverNameParts.length === 1) {
|
|
171
|
+
pushToObjectTypes({
|
|
172
|
+
objectTypes: res[resolverMainFilename].objectTypes,
|
|
173
|
+
property: resolverNameParts[0],
|
|
174
|
+
value: usage.identifierName,
|
|
175
|
+
});
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// 2+ parts, treat as 2 parts. This is a GraphQL ObjectType with field e.g. Query.me, Mutation.updateUser
|
|
180
|
+
const [rootObjectType, field] = resolverNameParts;
|
|
181
|
+
if (!isRootObjectType(rootObjectType)) {
|
|
182
|
+
throw new Error(`Unexpected root object type found: ${rootObjectType}`);
|
|
183
|
+
}
|
|
184
|
+
const fieldMapping: ObjectFieldMapping = {
|
|
185
|
+
identifierName: usage.identifierName,
|
|
186
|
+
propertyName: field,
|
|
187
|
+
};
|
|
188
|
+
const rootObjectMap: Record<RootObjectType, () => void> = {
|
|
189
|
+
Query: () => res[resolverMainFilename].queryFields.push(fieldMapping),
|
|
190
|
+
Mutation: () =>
|
|
191
|
+
res[resolverMainFilename].mutationFields.push(fieldMapping),
|
|
192
|
+
Subscription: () =>
|
|
193
|
+
res[resolverMainFilename].subscriptionFields.push(fieldMapping),
|
|
194
|
+
};
|
|
195
|
+
rootObjectMap[rootObjectType]();
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
return res;
|
|
199
|
+
}, resolverMainFiles);
|
|
200
|
+
|
|
201
|
+
const resolversIdentifier = 'resolvers';
|
|
202
|
+
const resolversTypeName = generatedResolverTypes.resolversMap.name;
|
|
203
|
+
|
|
204
|
+
Object.entries(resolverMainFiles).forEach(([resolverMainFilename, file]) => {
|
|
205
|
+
const outputDir = path.dirname(resolverMainFilename);
|
|
206
|
+
const relativePathToResolverTypes = relativeModulePath(
|
|
207
|
+
outputDir,
|
|
208
|
+
resolverTypesPath
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
const queries =
|
|
212
|
+
file.queryFields.length > 0
|
|
213
|
+
? `Query: { ${file.queryFields.map(printObjectMapping).join(',')} },`
|
|
214
|
+
: '';
|
|
215
|
+
const mutations =
|
|
216
|
+
file.mutationFields.length > 0
|
|
217
|
+
? `Mutation: { ${file.mutationFields
|
|
218
|
+
.map(printObjectMapping)
|
|
219
|
+
.join(',')} },`
|
|
220
|
+
: '';
|
|
221
|
+
const suscriptions =
|
|
222
|
+
file.subscriptionFields.length > 0
|
|
223
|
+
? `Subscription: { ${file.subscriptionFields
|
|
224
|
+
.map(printObjectMapping)
|
|
225
|
+
.join(',')} },`
|
|
226
|
+
: '';
|
|
227
|
+
|
|
228
|
+
result.files[resolverMainFilename] = {
|
|
229
|
+
__filetype: 'file',
|
|
230
|
+
// TODO: type='virtual' means we will generate these main files every run.
|
|
231
|
+
// Consider checking if these files are already on the filesystem, and whether the content has changed before generating?
|
|
232
|
+
filesystem: {
|
|
233
|
+
type: 'virtual',
|
|
234
|
+
contentUpdated: false,
|
|
235
|
+
},
|
|
236
|
+
mainImportIdentifier: resolversIdentifier,
|
|
237
|
+
content: `/* This file was automatically generated. DO NOT UPDATE MANUALLY. */
|
|
238
|
+
${printImportLine({
|
|
239
|
+
isTypeImport: true,
|
|
240
|
+
module: relativePathToResolverTypes,
|
|
241
|
+
moduleType: 'file',
|
|
242
|
+
namedImports: [resolversTypeName],
|
|
243
|
+
emitLegacyCommonJSImports,
|
|
244
|
+
importExtension,
|
|
245
|
+
})}
|
|
246
|
+
${file.importLines.join('\n')}
|
|
247
|
+
export const ${resolversIdentifier}: ${resolversTypeName} = {
|
|
248
|
+
${queries}
|
|
249
|
+
${mutations}
|
|
250
|
+
${suscriptions}
|
|
251
|
+
${printObjectTypes(file.objectTypes)}
|
|
252
|
+
}`,
|
|
253
|
+
};
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
interface ObjectFieldMapping {
|
|
258
|
+
propertyName: string;
|
|
259
|
+
identifierName: string;
|
|
260
|
+
}
|
|
261
|
+
const printObjectMapping = ({
|
|
262
|
+
propertyName,
|
|
263
|
+
identifierName,
|
|
264
|
+
}: ObjectFieldMapping): string => `${propertyName}: ${identifierName}`;
|
|
265
|
+
|
|
266
|
+
type ObjectTypesMap = Record<string, string[]>;
|
|
267
|
+
const pushToObjectTypes = ({
|
|
268
|
+
objectTypes,
|
|
269
|
+
property,
|
|
270
|
+
value,
|
|
271
|
+
}: {
|
|
272
|
+
objectTypes: ObjectTypesMap;
|
|
273
|
+
property: string;
|
|
274
|
+
value: string;
|
|
275
|
+
}): void => {
|
|
276
|
+
if (!objectTypes[property]) {
|
|
277
|
+
objectTypes[property] = [];
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
objectTypes[property].push(value);
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const printObjectTypes = (objectTypes: ObjectTypesMap): string => {
|
|
284
|
+
return Object.entries(objectTypes)
|
|
285
|
+
.map(([property, values]) => {
|
|
286
|
+
if (values.length === 1) {
|
|
287
|
+
return `${property}: ${values[0]}`;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const spreadedValueString = values
|
|
291
|
+
.map((value) => `...${value}`)
|
|
292
|
+
.join(',');
|
|
293
|
+
return `${property}: { ${spreadedValueString} }`;
|
|
294
|
+
})
|
|
295
|
+
.join(',\n');
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* countBaseIdentifiersUsage
|
|
300
|
+
*
|
|
301
|
+
* function to count how many of the same identifier is used across all files
|
|
302
|
+
*/
|
|
303
|
+
const countBaseIdentifiersUsage = (
|
|
304
|
+
files: GenerateResolverFilesContext['result']['files']
|
|
305
|
+
): Record<string, number> => {
|
|
306
|
+
return Object.entries(files).reduce<Record<string, number>>(
|
|
307
|
+
(res, [_filepath, file]) => {
|
|
308
|
+
if (file.__filetype === 'file') {
|
|
309
|
+
return res;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const identifier = makeNormalizedResolverNameVariableCompatible(
|
|
313
|
+
file.meta.normalizedResolverName.base
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
if (!res[identifier]) {
|
|
317
|
+
res[identifier] = 0;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
res[identifier]++;
|
|
321
|
+
|
|
322
|
+
return res;
|
|
323
|
+
},
|
|
324
|
+
{}
|
|
325
|
+
);
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* makeNormalizedResolverNameVariableCompatible
|
|
330
|
+
* @description Function to replace `-` and `.` in a string with underscore to be used as a variable name
|
|
331
|
+
*
|
|
332
|
+
* Note: this is to make sure the resolver name is a valid variable name because we use it in resolvers.generated.ts
|
|
333
|
+
* However, this naive implementation means there could be a duplicated variable name if a mix of kebab-case and snake_case is used.
|
|
334
|
+
* e.g. `user-by-account-name` and `user_by_account_name` will both be normalized to `user_by_account_name`
|
|
335
|
+
*
|
|
336
|
+
* If users report this issue. We can try another approach.
|
|
337
|
+
* I'm banking my slim hope in humanity that no codebase is so chaotic that it uses both kebab-case and snake_case.
|
|
338
|
+
*/
|
|
339
|
+
const makeNormalizedResolverNameVariableCompatible = (
|
|
340
|
+
identifier: string
|
|
341
|
+
): string => {
|
|
342
|
+
return identifier.replace(/[-.]/g, '_');
|
|
343
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { SyntaxKind, type SourceFile } from 'ts-morph';
|
|
2
|
+
import type { EnumResolverFile } from './types.js';
|
|
3
|
+
import { getVariableStatementWithExpectedIdentifier } from './getVariableStatementWithExpectedIdentifier.js';
|
|
4
|
+
|
|
5
|
+
export const ensureEnumTypeResolversAreGenerated = (
|
|
6
|
+
sourceFile: SourceFile,
|
|
7
|
+
resolverFile: EnumResolverFile
|
|
8
|
+
): void => {
|
|
9
|
+
const { variableStatement } = getVariableStatementWithExpectedIdentifier(
|
|
10
|
+
sourceFile,
|
|
11
|
+
resolverFile
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
if (!variableStatement) {
|
|
15
|
+
throw new Error(
|
|
16
|
+
'Missing variableStatement in ensureEnumTypeResolversAreGenerated.'
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const allowedValuesMap = resolverFile.meta.allowedValues.reduce<
|
|
21
|
+
Record<string, { implemented: boolean }>
|
|
22
|
+
>((res, allowedValue) => {
|
|
23
|
+
res[allowedValue] = { implemented: false };
|
|
24
|
+
return res;
|
|
25
|
+
}, {});
|
|
26
|
+
|
|
27
|
+
// Mark allowed value as implemented if found
|
|
28
|
+
variableStatement
|
|
29
|
+
.getDescendantsOfKind(SyntaxKind.PropertyAssignment)
|
|
30
|
+
.forEach((propertyAssignment) => {
|
|
31
|
+
const propertyName = propertyAssignment.getName();
|
|
32
|
+
if (allowedValuesMap[propertyName]) {
|
|
33
|
+
allowedValuesMap[propertyName].implemented = true;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Add unimplemented allowed values
|
|
38
|
+
Object.entries(allowedValuesMap).forEach(
|
|
39
|
+
([allowedValue, { implemented }]) => {
|
|
40
|
+
if (!implemented) {
|
|
41
|
+
variableStatement
|
|
42
|
+
.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression)[0]
|
|
43
|
+
.addPropertyAssignment({
|
|
44
|
+
name: allowedValue,
|
|
45
|
+
initializer: `'${allowedValue}'`,
|
|
46
|
+
});
|
|
47
|
+
resolverFile.filesystem.contentUpdated = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { addResolverMainFiles } from './addResolverMainFiles.js';
|
|
2
|
+
import { postProcessFiles } from './postProcessFiles.js';
|
|
3
|
+
import { handleGraphQLRootObjectTypeField } from './handleGraphQLRootObjectTypeField.js';
|
|
4
|
+
import { handleGraphQLObjectType } from './handleGraphQLObjectType.js';
|
|
5
|
+
import { handleGraphQLUnionType } from './handleGraphQLUnionType.js';
|
|
6
|
+
import { handleGraphQLScalarType } from './handleGraphQLScalarType.js';
|
|
7
|
+
import { handleGraphQLInterfaceType } from './handleGraphQLInterfaceType.js';
|
|
8
|
+
import { handleGraphQLEnumType } from './handleGraphQLEnumType.js';
|
|
9
|
+
import { visitNamedType } from './visitNamedType.js';
|
|
10
|
+
import type { GenerateResolverFilesContext } from './types.js';
|
|
11
|
+
|
|
12
|
+
export const generateResolverFiles = (
|
|
13
|
+
ctx: GenerateResolverFilesContext
|
|
14
|
+
): void => {
|
|
15
|
+
// Query
|
|
16
|
+
Object.values(
|
|
17
|
+
ctx.config.parsedGraphQLSchemaMeta.userDefinedSchemaTypeMap.query
|
|
18
|
+
).forEach((details) => {
|
|
19
|
+
visitNamedType(
|
|
20
|
+
{
|
|
21
|
+
...details,
|
|
22
|
+
belongsToRootObject: 'Query',
|
|
23
|
+
visitor: handleGraphQLRootObjectTypeField,
|
|
24
|
+
},
|
|
25
|
+
ctx
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Mutation
|
|
30
|
+
Object.values(
|
|
31
|
+
ctx.config.parsedGraphQLSchemaMeta.userDefinedSchemaTypeMap.mutation
|
|
32
|
+
).forEach((details) => {
|
|
33
|
+
visitNamedType(
|
|
34
|
+
{
|
|
35
|
+
...details,
|
|
36
|
+
belongsToRootObject: 'Mutation',
|
|
37
|
+
visitor: handleGraphQLRootObjectTypeField,
|
|
38
|
+
},
|
|
39
|
+
ctx
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Subscription
|
|
44
|
+
Object.values(
|
|
45
|
+
ctx.config.parsedGraphQLSchemaMeta.userDefinedSchemaTypeMap.subscription
|
|
46
|
+
).forEach((details) => {
|
|
47
|
+
visitNamedType(
|
|
48
|
+
{
|
|
49
|
+
...details,
|
|
50
|
+
belongsToRootObject: 'Subscription',
|
|
51
|
+
visitor: handleGraphQLRootObjectTypeField,
|
|
52
|
+
},
|
|
53
|
+
ctx
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Object
|
|
58
|
+
Object.values(
|
|
59
|
+
ctx.config.parsedGraphQLSchemaMeta.userDefinedSchemaTypeMap.object
|
|
60
|
+
).forEach((objectsByModules) => {
|
|
61
|
+
Object.values(objectsByModules).forEach((details) => {
|
|
62
|
+
visitNamedType(
|
|
63
|
+
{
|
|
64
|
+
...details,
|
|
65
|
+
belongsToRootObject: null,
|
|
66
|
+
visitor: (baseParams, prev_ctx) =>
|
|
67
|
+
handleGraphQLObjectType(
|
|
68
|
+
{
|
|
69
|
+
...baseParams,
|
|
70
|
+
fieldsToPick: details.fieldsToPick,
|
|
71
|
+
},
|
|
72
|
+
prev_ctx
|
|
73
|
+
),
|
|
74
|
+
},
|
|
75
|
+
ctx
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Scalar
|
|
81
|
+
Object.values(
|
|
82
|
+
ctx.config.parsedGraphQLSchemaMeta.userDefinedSchemaTypeMap.scalar
|
|
83
|
+
).forEach((details) => {
|
|
84
|
+
visitNamedType(
|
|
85
|
+
{
|
|
86
|
+
...details,
|
|
87
|
+
belongsToRootObject: null,
|
|
88
|
+
visitor: handleGraphQLScalarType,
|
|
89
|
+
},
|
|
90
|
+
ctx
|
|
91
|
+
);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Interface
|
|
95
|
+
Object.values(
|
|
96
|
+
ctx.config.parsedGraphQLSchemaMeta.userDefinedSchemaTypeMap.interface
|
|
97
|
+
).forEach((details) => {
|
|
98
|
+
visitNamedType(
|
|
99
|
+
{
|
|
100
|
+
...details,
|
|
101
|
+
belongsToRootObject: null,
|
|
102
|
+
visitor: handleGraphQLInterfaceType,
|
|
103
|
+
},
|
|
104
|
+
ctx
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Union
|
|
109
|
+
Object.values(
|
|
110
|
+
ctx.config.parsedGraphQLSchemaMeta.userDefinedSchemaTypeMap.union
|
|
111
|
+
).forEach((details) => {
|
|
112
|
+
visitNamedType(
|
|
113
|
+
{
|
|
114
|
+
...details,
|
|
115
|
+
belongsToRootObject: null,
|
|
116
|
+
visitor: handleGraphQLUnionType,
|
|
117
|
+
},
|
|
118
|
+
ctx
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// Enum
|
|
123
|
+
Object.values(
|
|
124
|
+
ctx.config.parsedGraphQLSchemaMeta.userDefinedSchemaTypeMap.enum
|
|
125
|
+
).forEach((details) => {
|
|
126
|
+
visitNamedType(
|
|
127
|
+
{
|
|
128
|
+
...details,
|
|
129
|
+
belongsToRootObject: null,
|
|
130
|
+
visitor: (baseParams, prev_ctx) =>
|
|
131
|
+
handleGraphQLEnumType(
|
|
132
|
+
{
|
|
133
|
+
...baseParams,
|
|
134
|
+
allowedValues: details.allowedValues,
|
|
135
|
+
},
|
|
136
|
+
prev_ctx
|
|
137
|
+
),
|
|
138
|
+
},
|
|
139
|
+
ctx
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// Post process generated files (could be existing files or files to be generated)
|
|
144
|
+
postProcessFiles(ctx);
|
|
145
|
+
|
|
146
|
+
// Put all resolvers into barrel file/s (or main file/s)
|
|
147
|
+
addResolverMainFiles(ctx);
|
|
148
|
+
};
|