From 84793f8f6dc054b6106071cd635fb1a85d873fbc Mon Sep 17 00:00:00 2001 From: Florian Harr Date: Tue, 5 Mar 2024 14:52:04 -0500 Subject: [PATCH 1/4] chore(vars-generator): Applying vars generation to input types --- codegen/gql_build/lib/gql_build.dart | 3 ++- codegen/gql_build/lib/src/schema_builder.dart | 10 +++++++-- codegen/gql_code_builder/lib/schema.dart | 12 ++++++++--- codegen/gql_code_builder/lib/src/schema.dart | 17 +++++++++++---- .../lib/src/schema/input.dart | 21 +++++++++++++++++++ 5 files changed, 53 insertions(+), 10 deletions(-) diff --git a/codegen/gql_build/lib/gql_build.dart b/codegen/gql_build/lib/gql_build.dart index 9cc5da91..5e31e69d 100644 --- a/codegen/gql_build/lib/gql_build.dart +++ b/codegen/gql_build/lib/gql_build.dart @@ -58,7 +58,8 @@ Builder schemaBuilder( typeOverrideMap(options.config["type_overrides"]), enumFallbackConfig(options.config), generatePossibleTypesConfig(options.config), - triStateOptionalsConfig(options.config)); + triStateOptionalsConfig(options.config), + varsCreateFactoriesConfig(options.config)); /// Builds an aggregate Serlializers object for [built_value]s /// diff --git a/codegen/gql_build/lib/src/schema_builder.dart b/codegen/gql_build/lib/src/schema_builder.dart index 1a8c78a8..3992452a 100644 --- a/codegen/gql_build/lib/src/schema_builder.dart +++ b/codegen/gql_build/lib/src/schema_builder.dart @@ -15,9 +15,14 @@ class SchemaBuilder implements Builder { final EnumFallbackConfig enumFallbackConfig; final bool generatePossibleTypesMap; final TriStateValueConfig triStateValueConfig; + final bool generateVarsCreateFactories; - SchemaBuilder(this.typeOverrides, this.enumFallbackConfig, - this.generatePossibleTypesMap, this.triStateValueConfig); + SchemaBuilder( + this.typeOverrides, + this.enumFallbackConfig, + this.generatePossibleTypesMap, + this.triStateValueConfig, + this.generateVarsCreateFactories); @override Map> get buildExtensions => { @@ -49,6 +54,7 @@ class SchemaBuilder implements Builder { generatePossibleTypesMap: generatePossibleTypesMap, allocator: allocator, triStateValueConfig: triStateValueConfig, + generateVarsCreateFactories: generateVarsCreateFactories, ); return writeDocument( diff --git a/codegen/gql_code_builder/lib/schema.dart b/codegen/gql_code_builder/lib/schema.dart index b4724675..5f532672 100644 --- a/codegen/gql_code_builder/lib/schema.dart +++ b/codegen/gql_code_builder/lib/schema.dart @@ -13,9 +13,15 @@ Library buildSchemaLibrary(SourceNode schemaSource, String partUrl, Map typeOverrides, EnumFallbackConfig enumFallbackConfig, {bool generatePossibleTypesMap = false, Allocator? allocator, - TriStateValueConfig triStateValueConfig = TriStateValueConfig.never}) { - final lib = buildSchema(schemaSource, typeOverrides, enumFallbackConfig, - allocator ?? Allocator(), triStateValueConfig) as Library; + TriStateValueConfig triStateValueConfig = TriStateValueConfig.never, + bool generateVarsCreateFactories = false}) { + final lib = buildSchema( + schemaSource, + typeOverrides, + enumFallbackConfig, + allocator ?? Allocator(), + triStateValueConfig, + generateVarsCreateFactories) as Library; final Code? possibleTypes; if (generatePossibleTypesMap && lib.body.isNotEmpty) { diff --git a/codegen/gql_code_builder/lib/src/schema.dart b/codegen/gql_code_builder/lib/src/schema.dart index c28bee89..4ddcbc4d 100644 --- a/codegen/gql_code_builder/lib/src/schema.dart +++ b/codegen/gql_code_builder/lib/src/schema.dart @@ -15,6 +15,7 @@ Spec? buildSchema( EnumFallbackConfig enumFallbackConfig, Allocator allocator, TriStateValueConfig triStateValueConfig, + bool generateVarsCreateFactories, ) => schemaSource.document .accept( @@ -24,6 +25,7 @@ Spec? buildSchema( enumFallbackConfig, allocator, triStateValueConfig, + generateVarsCreateFactories, ), ) ?.first; @@ -36,8 +38,15 @@ class _SchemaBuilderVisitor extends SimpleVisitor?> { final Allocator allocator; final TriStateValueConfig triStateValueConfig; - const _SchemaBuilderVisitor(this.schemaSource, this.typeOverrides, - this.enumFallbackConfig, this.allocator, this.triStateValueConfig); + final bool generateVarsCreateFactories; + + const _SchemaBuilderVisitor( + this.schemaSource, + this.typeOverrides, + this.enumFallbackConfig, + this.allocator, + this.triStateValueConfig, + this.generateVarsCreateFactories); @override List visitDocumentNode( @@ -57,8 +66,8 @@ class _SchemaBuilderVisitor extends SimpleVisitor?> { List visitInputObjectTypeDefinitionNode( InputObjectTypeDefinitionNode node, ) { - final inputClass = - buildInputClass(node, schemaSource, typeOverrides, triStateValueConfig); + final inputClass = buildInputClass(node, schemaSource, typeOverrides, + triStateValueConfig, generateVarsCreateFactories); return switch (triStateValueConfig) { TriStateValueConfig.never => [inputClass], diff --git a/codegen/gql_code_builder/lib/src/schema/input.dart b/codegen/gql_code_builder/lib/src/schema/input.dart index e0516444..830cfca3 100644 --- a/codegen/gql_code_builder/lib/src/schema/input.dart +++ b/codegen/gql_code_builder/lib/src/schema/input.dart @@ -1,6 +1,7 @@ import "package:code_builder/code_builder.dart"; import "package:gql/ast.dart"; import "package:gql_code_builder/src/config/tristate_optionals_config.dart"; +import "package:gql_code_builder/src/required_vars_constructor.dart"; import "package:gql_code_builder/src/tristate_optionals.dart"; import "../../source.dart"; @@ -12,6 +13,7 @@ List buildInputClasses( Map typeOverrides, Allocator allocator, TriStateValueConfig triStateValueConfig, + bool generateVarsCreateFactories, ) => schemaSource.document.definitions .whereType() @@ -21,6 +23,7 @@ List buildInputClasses( schemaSource, typeOverrides, triStateValueConfig, + generateVarsCreateFactories, ); final serializer = nullAwareJsonSerializerClass( inputClass, allocator, schemaSource, typeOverrides); @@ -32,6 +35,7 @@ Class buildInputClass( SourceNode schemaSource, Map typeOverrides, TriStateValueConfig triStateValueConfig, + bool generateVarsCreateFactories, ) => builtClass( name: node.name.value, @@ -46,6 +50,23 @@ Class buildInputClass( ), hasCustomSerializer: triStateValueConfig == TriStateValueConfig.onAllNullableFields, + constructors: [ + if (generateVarsCreateFactories) + builtCreateConstructor( + name: node.name.value, + getters: node.fields.map( + (node) => buildOptionalGetter( + nameNode: node.name, + typeNode: node.type, + schemaSource: schemaSource, + typeOverrides: typeOverrides, + useTriStateValueForNullableTypes: triStateValueConfig, + ), + ), + schemaSource: schemaSource, + typeOverrides: typeOverrides, + ), + ], initializers: { if (triStateValueConfig == TriStateValueConfig.onAllNullableFields) ..._inputClassValueInitializers(node) From a47653da1170bceb32fd91bb81d45833415d7a7f Mon Sep 17 00:00:00 2001 From: Florian Harr Date: Tue, 5 Mar 2024 15:03:20 -0500 Subject: [PATCH 2/4] Adding codegen artifacts to e2e tests --- codegen/end_to_end_test/build.yaml | 1 + .../__generated__/schema.schema.gql.dart | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/codegen/end_to_end_test/build.yaml b/codegen/end_to_end_test/build.yaml index c9ec1014..9d6ae223 100644 --- a/codegen/end_to_end_test/build.yaml +++ b/codegen/end_to_end_test/build.yaml @@ -25,6 +25,7 @@ targets: gql_build|schema_builder: enabled: true options: + vars_create_factories: true enum_fallbacks: LengthUnit: METER type_overrides: diff --git a/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart b/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart index a5e5943a..51003156 100644 --- a/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart +++ b/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart @@ -54,6 +54,18 @@ abstract class GReviewInput factory GReviewInput([void Function(GReviewInputBuilder b) updates]) = _$GReviewInput; + factory GReviewInput.create({ + required int stars, + String? commentary, + GColorInput? favorite_color, + BuiltList? seenOn, + }) => + GReviewInput((b) => b + ..stars = stars + ..commentary = commentary + ..favorite_color = favorite_color?.toBuilder() + ..seenOn = seenOn?.toBuilder()); + int get stars; String? get commentary; GColorInput? get favorite_color; @@ -80,6 +92,14 @@ abstract class GCustomFieldInput [void Function(GCustomFieldInputBuilder b) updates]) = _$GCustomFieldInput; + factory GCustomFieldInput.create({ + required String id, + _i2.CustomField? customField, + }) => + GCustomFieldInput((b) => b + ..id = id + ..customField = customField); + String get id; _i2.CustomField? get customField; static Serializer get serializer => @@ -103,6 +123,16 @@ abstract class GColorInput implements Built { factory GColorInput([void Function(GColorInputBuilder b) updates]) = _$GColorInput; + factory GColorInput.create({ + required int red, + required int green, + required int blue, + }) => + GColorInput((b) => b + ..red = red + ..green = green + ..blue = blue); + int get red; int get green; int get blue; @@ -127,6 +157,9 @@ abstract class GPostLikesInput factory GPostLikesInput([void Function(GPostLikesInputBuilder b) updates]) = _$GPostLikesInput; + factory GPostLikesInput.create({required String id}) => + GPostLikesInput((b) => b..id = id); + String get id; static Serializer get serializer => _$gPostLikesInputSerializer; @@ -151,6 +184,9 @@ abstract class GPostFavoritesInput [void Function(GPostFavoritesInputBuilder b) updates]) = _$GPostFavoritesInput; + factory GPostFavoritesInput.create({required String id}) => + GPostFavoritesInput((b) => b..id = id); + String get id; static Serializer get serializer => _$gPostFavoritesInputSerializer; From 6c399c60f9be21977ae9a331fd1ff70af5054f1f Mon Sep 17 00:00:00 2001 From: Florian Harr Date: Tue, 5 Mar 2024 15:04:20 -0500 Subject: [PATCH 3/4] Adding codegen artifacts to e2e tristate --- codegen/end_to_end_test_tristate/build.yaml | 1 + .../__generated__/schema.schema.gql.dart | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/codegen/end_to_end_test_tristate/build.yaml b/codegen/end_to_end_test_tristate/build.yaml index 34f5af92..b98704f1 100644 --- a/codegen/end_to_end_test_tristate/build.yaml +++ b/codegen/end_to_end_test_tristate/build.yaml @@ -25,6 +25,7 @@ targets: gql_build|schema_builder: enabled: true options: + vars_create_factories: true tristate_optionals: true enum_fallbacks: LengthUnit: METER diff --git a/codegen/end_to_end_test_tristate/lib/graphql/__generated__/schema.schema.gql.dart b/codegen/end_to_end_test_tristate/lib/graphql/__generated__/schema.schema.gql.dart index a4d268dc..31034415 100644 --- a/codegen/end_to_end_test_tristate/lib/graphql/__generated__/schema.schema.gql.dart +++ b/codegen/end_to_end_test_tristate/lib/graphql/__generated__/schema.schema.gql.dart @@ -55,6 +55,18 @@ abstract class GReviewInput factory GReviewInput([void Function(GReviewInputBuilder b) updates]) = _$GReviewInput; + factory GReviewInput.create({ + required int stars, + required _i1.Value commentary, + required _i1.Value favorite_color, + required _i1.Value> seenOn, + }) => + GReviewInput((b) => b + ..stars = stars + ..commentary = commentary + ..favorite_color = favorite_color + ..seenOn = seenOn); + static void _initializeBuilder(GReviewInputBuilder b) => b ..commentary = const _i1.AbsentValue() ..favorite_color = const _i1.AbsentValue() @@ -162,6 +174,14 @@ abstract class GCustomFieldInput [void Function(GCustomFieldInputBuilder b) updates]) = _$GCustomFieldInput; + factory GCustomFieldInput.create({ + required String id, + required _i1.Value<_i2.CustomField> customField, + }) => + GCustomFieldInput((b) => b + ..id = id + ..customField = customField); + static void _initializeBuilder(GCustomFieldInputBuilder b) => b..customField = const _i1.AbsentValue(); @@ -242,6 +262,16 @@ abstract class GColorInput implements Built { factory GColorInput([void Function(GColorInputBuilder b) updates]) = _$GColorInput; + factory GColorInput.create({ + required int red, + required int green, + required int blue, + }) => + GColorInput((b) => b + ..red = red + ..green = green + ..blue = blue); + int get red; int get green; int get blue; @@ -323,6 +353,9 @@ abstract class GPostLikesInput factory GPostLikesInput([void Function(GPostLikesInputBuilder b) updates]) = _$GPostLikesInput; + factory GPostLikesInput.create({required String id}) => + GPostLikesInput((b) => b..id = id); + String get id; Map toJson() => (_i3.serializers.serializeWith( GPostLikesInput.serializer, @@ -389,6 +422,9 @@ abstract class GPostFavoritesInput [void Function(GPostFavoritesInputBuilder b) updates]) = _$GPostFavoritesInput; + factory GPostFavoritesInput.create({required String id}) => + GPostFavoritesInput((b) => b..id = id); + String get id; Map toJson() => (_i3.serializers.serializeWith( GPostFavoritesInput.serializer, From fadc5fb5d2605ed4c64d196c3ffda5507ea2c26e Mon Sep 17 00:00:00 2001 From: Florian Harr Date: Tue, 5 Mar 2024 15:10:43 -0500 Subject: [PATCH 4/4] Adding Unit Test --- codegen/end_to_end_test/test/schema/input_test.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/codegen/end_to_end_test/test/schema/input_test.dart b/codegen/end_to_end_test/test/schema/input_test.dart index a4cc444e..050c81bd 100644 --- a/codegen/end_to_end_test/test/schema/input_test.dart +++ b/codegen/end_to_end_test/test/schema/input_test.dart @@ -13,6 +13,13 @@ void main() { ..favorite_color.red = 225); }); + test('can be instantiated via create factory', () { + GReviewInput.create( + stars: 4, + commentary: "This was a great movie!", + favorite_color: GColorInput.create(red: 255, green: 123, blue: 225)); + }); + test('can be serialized and deserialized', () { final input = GReviewInput((b) => b ..stars = 4