@@ -7,6 +7,7 @@ import 'package:graphql_codegen/src/printer/base/copy.dart';
77import 'package:graphql_codegen/src/printer/base/equality.dart' ;
88import 'package:graphql_codegen/src/printer/base/json.dart' ;
99import 'package:graphql_codegen/src/printer/base/property.dart' ;
10+ import 'package:graphql_codegen/src/printer/base/undefined.dart' ;
1011import 'package:graphql_codegen/src/printer/clients/utils.dart' ;
1112import 'package:graphql_codegen/src/printer/context.dart' ;
1213import 'package:graphql_codegen/src/printer/utils.dart' ;
@@ -84,6 +85,12 @@ List<Spec> _printInputClasses({
8485 ]).code,
8586 ),
8687 )
88+ else if (context.context.config.enableInputBuilders)
89+ _printInputBuilderConstructor (
90+ context: context,
91+ properties: properties,
92+ name: name,
93+ )
8794 else
8895 Constructor (
8996 (b) => b
@@ -142,7 +149,10 @@ List<Spec> _printInputClasses({
142149 (b) => b
143150 ..name = kDataVariableName
144151 ..type = dynamicMap,
145- )
152+ ),
153+ if (context.context.config.enableInputBuilders &&
154+ ! context.context.isOneOf)
155+ printUndefinedField (),
146156 ])
147157 ..methods = ListBuilder ([
148158 ...properties.map ((e) => Method (
@@ -209,9 +219,10 @@ List<Spec> _printInputClasses({
209219 final propName = context.namePrinter.printPropertyName (prop.name);
210220 return [
211221 if (prop.isNonNull)
212- Code ('if(${propName } != _undefined && ${propName } != null)' )
222+ Code (
223+ 'if(${propName } != ${kUndefinedFieldName } && ${propName } != null)' )
213224 else
214- Code ('if(${propName } != _undefined )' ),
225+ Code ('if(${propName } != ${ kUndefinedFieldName } )' ),
215226 literalString (prop.name.value).code,
216227 Code (':' ),
217228 refer (propName).asA (printClassPropertyType (context, prop)).code,
@@ -225,6 +236,115 @@ List<Spec> _printInputClasses({
225236 ];
226237}
227238
239+ Constructor _printInputBuilderConstructor (
240+ {required PrintContext context,
241+ required String Function (Name ) name,
242+ required Iterable <ContextProperty > properties}) {
243+ final buildPropertyMapEntry = (ContextProperty property) => MapEntry (
244+ context.namePrinter.printPropertyName (
245+ property.name,
246+ ),
247+ property.hasDefaultValue
248+ ? asNullable (
249+ printClassPropertyType (
250+ context,
251+ property,
252+ ),
253+ )
254+ : printClassPropertyType (
255+ context,
256+ property,
257+ ),
258+ );
259+ final fnName = 'fn' ;
260+ return Constructor (
261+ (b) => b
262+ ..factory = true
263+ ..requiredParameters = ListBuilder <Parameter >(
264+ [
265+ Parameter (
266+ (b) => b
267+ ..name = fnName
268+ ..type = FunctionType (
269+ (b) => b
270+ ..returnType = refer (name (context.path))
271+ ..requiredParameters = ListBuilder <Reference >(
272+ [
273+ FunctionType (
274+ (b) => b
275+ ..namedParameters = MapBuilder (
276+ Map .fromEntries (
277+ properties
278+ .where ((property) => ! property.isRequired)
279+ .map (buildPropertyMapEntry),
280+ ),
281+ )
282+ ..namedRequiredParameters = MapBuilder (
283+ Map .fromEntries (
284+ properties
285+ .where ((property) => property.isRequired)
286+ .map (buildPropertyMapEntry),
287+ ),
288+ )
289+ ..returnType = refer (
290+ name (context.path),
291+ ),
292+ )
293+ ],
294+ ),
295+ ),
296+ )
297+ ],
298+ )
299+ ..body = refer (fnName).call (
300+ [
301+ Method (
302+ (b) => b
303+ ..optionalParameters = ListBuilder (
304+ properties.map (
305+ (property) => Parameter (
306+ (b) => b
307+ ..name = context.namePrinter.printPropertyName (
308+ property.name,
309+ )
310+ ..named = true
311+ ..required = property.isRequired
312+ ..defaultTo = property.isRequired
313+ ? null
314+ : refer (kUndefinedFieldName).code
315+ ..type = property.isRequired
316+ ? printClassPropertyType (context, property)
317+ : refer ('Object?' ),
318+ ),
319+ ),
320+ )
321+ ..body = refer (name (context.path)).property ('_' ).call ([
322+ CodeExpression (Code (
323+ """
324+ {
325+ ${properties .map ((property ) {
326+ final key = property .name .value ;
327+ final value = context .namePrinter .printPropertyName (
328+ property .name ,
329+ );
330+ final entry = "r'${key }': ${value }," ;
331+ if (property .isRequired ) {
332+ return entry ;
333+ }
334+ return """
335+ if (${value } != ${kUndefinedFieldName }) ${entry }
336+ """ ;
337+ }).join ()}
338+ }
339+ """ ,
340+ )),
341+ ]).code,
342+ ).closure
343+ ],
344+ ).code,
345+ );
346+ }
347+
228348Code _printToJson (PrintContext context, Iterable <ContextProperty > properties) {
229349 const resultDataVariableName = r'result$data' ;
230350 return Block .of ([
0 commit comments