|
3 | 3 | import com.kobylynskyi.graphql.codegen.mapper.*; |
4 | 4 | import com.kobylynskyi.graphql.codegen.model.DefaultMappingConfigValues; |
5 | 5 | import com.kobylynskyi.graphql.codegen.model.MappingConfig; |
| 6 | +import com.kobylynskyi.graphql.codegen.model.MappingContext; |
6 | 7 | import com.kobylynskyi.graphql.codegen.model.definitions.*; |
7 | 8 | import com.kobylynskyi.graphql.codegen.supplier.MappingConfigSupplier; |
8 | | -import graphql.language.*; |
| 9 | +import graphql.language.FieldDefinition; |
| 10 | +import graphql.language.ScalarTypeExtensionDefinition; |
9 | 11 | import lombok.Getter; |
10 | 12 | import lombok.Setter; |
11 | 13 |
|
@@ -101,102 +103,104 @@ public List<File> generate() throws Exception { |
101 | 103 | } |
102 | 104 |
|
103 | 105 | private List<File> processDefinitions(ExtendedDocument document) { |
| 106 | + MappingContext context = new MappingContext(mappingConfig, document, |
| 107 | + document.getTypeNames(), document.getInterfaceNames()); |
| 108 | + |
104 | 109 | List<File> generatedFiles = new ArrayList<>(); |
105 | | - Set<String> typeNames = document.getTypeNames(); |
106 | 110 | for (ExtendedObjectTypeDefinition extendedObjectTypeDefinition : document.getTypeDefinitions()) { |
107 | | - generatedFiles.addAll(generateType(extendedObjectTypeDefinition, document, typeNames)); |
| 111 | + generatedFiles.addAll(generateType(context, extendedObjectTypeDefinition)); |
108 | 112 | } |
109 | 113 | for (ExtendedObjectTypeDefinition extendedObjectTypeDefinition : document.getTypeDefinitions()) { |
110 | | - generateFieldResolver(extendedObjectTypeDefinition.getFieldDefinitions(), extendedObjectTypeDefinition.getName()) |
| 114 | + generateFieldResolver(context, extendedObjectTypeDefinition.getFieldDefinitions(), extendedObjectTypeDefinition.getName()) |
111 | 115 | .ifPresent(generatedFiles::add); |
112 | 116 | } |
113 | 117 | for (ExtendedObjectTypeDefinition extendedObjectTypeDefinition : document.getOperationDefinitions()) { |
114 | | - generatedFiles.addAll(generateOperation(extendedObjectTypeDefinition)); |
| 118 | + generatedFiles.addAll(generateOperation(context, extendedObjectTypeDefinition)); |
115 | 119 | } |
116 | 120 | for (ExtendedInputObjectTypeDefinition extendedInputObjectTypeDefinition : document.getInputDefinitions()) { |
117 | | - generatedFiles.add(generateInput(extendedInputObjectTypeDefinition)); |
| 121 | + generatedFiles.add(generateInput(context, extendedInputObjectTypeDefinition)); |
118 | 122 | } |
119 | 123 | for (ExtendedEnumTypeDefinition extendedEnumTypeDefinition : document.getEnumDefinitions()) { |
120 | | - generatedFiles.add(generateEnum(extendedEnumTypeDefinition)); |
| 124 | + generatedFiles.add(generateEnum(context, extendedEnumTypeDefinition)); |
121 | 125 | } |
122 | 126 | for (ExtendedUnionTypeDefinition extendedUnionTypeDefinition : document.getUnionDefinitions()) { |
123 | | - generatedFiles.add(generateUnion(extendedUnionTypeDefinition)); |
| 127 | + generatedFiles.add(generateUnion(context, extendedUnionTypeDefinition)); |
124 | 128 | } |
125 | 129 | for (ExtendedInterfaceTypeDefinition extendedInterfaceTypeDefinition : document.getInterfaceDefinitions()) { |
126 | | - generatedFiles.add(generateInterface(extendedInterfaceTypeDefinition)); |
| 130 | + generatedFiles.add(generateInterface(context, extendedInterfaceTypeDefinition)); |
127 | 131 | } |
128 | 132 | for (ExtendedInterfaceTypeDefinition definition : document.getInterfaceDefinitions()) { |
129 | | - generateFieldResolver(definition.getFieldDefinitions(), definition.getName()) |
| 133 | + generateFieldResolver(context, definition.getFieldDefinitions(), definition.getName()) |
130 | 134 | .ifPresent(generatedFiles::add); |
131 | 135 | } |
132 | 136 | System.out.println(String.format("Generated %d definition classes in folder %s", |
133 | 137 | generatedFiles.size(), outputDir.getAbsolutePath())); |
134 | 138 | return generatedFiles; |
135 | 139 | } |
136 | 140 |
|
137 | | - private File generateUnion(ExtendedUnionTypeDefinition definition) { |
138 | | - Map<String, Object> dataModel = UnionDefinitionToDataModelMapper.map(mappingConfig, definition); |
| 141 | + private File generateUnion(MappingContext mappingContext, ExtendedUnionTypeDefinition definition) { |
| 142 | + Map<String, Object> dataModel = UnionDefinitionToDataModelMapper.map(mappingContext, definition); |
139 | 143 | return GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.unionTemplate, dataModel, outputDir); |
140 | 144 | } |
141 | 145 |
|
142 | | - private File generateInterface(ExtendedInterfaceTypeDefinition definition) { |
143 | | - Map<String, Object> dataModel = InterfaceDefinitionToDataModelMapper.map(mappingConfig, definition); |
| 146 | + private File generateInterface(MappingContext mappingContext, ExtendedInterfaceTypeDefinition definition) { |
| 147 | + Map<String, Object> dataModel = InterfaceDefinitionToDataModelMapper.map(mappingContext, definition); |
144 | 148 | return GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.interfaceTemplate, dataModel, outputDir); |
145 | 149 | } |
146 | 150 |
|
147 | | - private List<File> generateOperation(ExtendedObjectTypeDefinition definition) { |
| 151 | + private List<File> generateOperation(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { |
148 | 152 | List<File> generatedFiles = new ArrayList<>(); |
149 | 153 | List<String> fieldNames = definition.getFieldDefinitions().stream().map(FieldDefinition::getName).collect(toList()); |
150 | 154 | if (Boolean.TRUE.equals(mappingConfig.getGenerateApis())) { |
151 | 155 | for (ExtendedFieldDefinition operationDef : definition.getFieldDefinitions()) { |
152 | | - Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapRootTypeField(mappingConfig, operationDef, definition.getName(), fieldNames); |
| 156 | + Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapRootTypeField(mappingContext, operationDef, definition.getName(), fieldNames); |
153 | 157 | generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir)); |
154 | 158 | } |
155 | 159 | // We need to generate a root object to workaround https://github.com/facebook/relay/issues/112 |
156 | | - Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapRootTypeFields(mappingConfig, definition); |
| 160 | + Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapRootTypeFields(mappingContext, definition); |
157 | 161 | generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir)); |
158 | 162 | } |
159 | 163 |
|
160 | 164 | if (Boolean.TRUE.equals(mappingConfig.getGenerateRequests())) { |
161 | 165 | // generate request objects for graphql operations |
162 | 166 | for (ExtendedFieldDefinition operationDef : definition.getFieldDefinitions()) { |
163 | | - Map<String, Object> requestDataModel = FieldDefinitionToRequestDataModelMapper.map(mappingConfig, operationDef, definition.getName(), fieldNames); |
| 167 | + Map<String, Object> requestDataModel = FieldDefinitionToRequestDataModelMapper.map(mappingContext, operationDef, definition.getName(), fieldNames); |
164 | 168 | generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.requestTemplate, requestDataModel, outputDir)); |
165 | 169 | } |
166 | 170 | } |
167 | 171 | return generatedFiles; |
168 | 172 | } |
169 | 173 |
|
170 | | - private List<File> generateType(ExtendedObjectTypeDefinition definition, ExtendedDocument document, Set<String> typeNames) { |
| 174 | + private List<File> generateType(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { |
171 | 175 | List<File> generatedFiles = new ArrayList<>(); |
172 | | - Map<String, Object> dataModel = TypeDefinitionToDataModelMapper.map(mappingConfig, definition, document); |
| 176 | + Map<String, Object> dataModel = TypeDefinitionToDataModelMapper.map(mappingContext, definition); |
173 | 177 | generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.typeTemplate, dataModel, outputDir)); |
174 | 178 |
|
175 | 179 | if (Boolean.TRUE.equals(mappingConfig.getGenerateRequests())) { |
176 | | - Map<String, Object> responseProjDataModel = TypeDefinitionToDataModelMapper.mapResponseProjection(mappingConfig, definition, document, typeNames); |
| 180 | + Map<String, Object> responseProjDataModel = TypeDefinitionToDataModelMapper.mapResponseProjection(mappingContext, definition); |
177 | 181 | generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.responseProjectionTemplate, responseProjDataModel, outputDir)); |
178 | 182 | } |
179 | 183 | return generatedFiles; |
180 | 184 | } |
181 | 185 |
|
182 | | - private Optional<File> generateFieldResolver(List<ExtendedFieldDefinition> fieldDefinitions, String definitionName) { |
| 186 | + private Optional<File> generateFieldResolver(MappingContext mappingContext, List<ExtendedFieldDefinition> fieldDefinitions, String definitionName) { |
183 | 187 | List<ExtendedFieldDefinition> fieldDefsWithResolvers = fieldDefinitions.stream() |
184 | | - .filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingConfig, fieldDef, definitionName)) |
| 188 | + .filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingContext, fieldDef, definitionName)) |
185 | 189 | .collect(toList()); |
186 | 190 | if (!fieldDefsWithResolvers.isEmpty()) { |
187 | | - Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapToTypeResolver(mappingConfig, fieldDefsWithResolvers, definitionName); |
| 191 | + Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapToTypeResolver(mappingContext, fieldDefsWithResolvers, definitionName); |
188 | 192 | return Optional.of(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir)); |
189 | 193 | } |
190 | 194 | return Optional.empty(); |
191 | 195 | } |
192 | 196 |
|
193 | | - private File generateInput(ExtendedInputObjectTypeDefinition definition) { |
194 | | - Map<String, Object> dataModel = InputDefinitionToDataModelMapper.map(mappingConfig, definition); |
| 197 | + private File generateInput(MappingContext mappingContext, ExtendedInputObjectTypeDefinition definition) { |
| 198 | + Map<String, Object> dataModel = InputDefinitionToDataModelMapper.map(mappingContext, definition); |
195 | 199 | return GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.typeTemplate, dataModel, outputDir); |
196 | 200 | } |
197 | 201 |
|
198 | | - private File generateEnum(ExtendedEnumTypeDefinition definition) { |
199 | | - Map<String, Object> dataModel = EnumDefinitionToDataModelMapper.map(mappingConfig, definition); |
| 202 | + private File generateEnum(MappingContext mappingContext, ExtendedEnumTypeDefinition definition) { |
| 203 | + Map<String, Object> dataModel = EnumDefinitionToDataModelMapper.map(mappingContext, definition); |
200 | 204 | return GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.enumTemplate, dataModel, outputDir); |
201 | 205 | } |
202 | 206 |
|
|
0 commit comments